首页 > 解决方案 > 更新 Django 模型中的对象

问题描述

我的应用中有一个模型,名为foo

class foo(models.Model):
    a = models.CharField(max_length=500, default=0,null=True)
    a_quantity = models.CharField(max_length=500, default=0, null=True)

我正在从另一种形式更新这个模型:

 def form_valid (self, form):
        product = form.save(commit=False)
        product.save()
        data = form.cleaned_data
        for i in range(1, 9):
            foo.objects.update_or_create(a=data["a" + str(i)],
                                                     b=data["a_quantity" + str(i)])

但这里的问题是它会创建一个新条目 if ais same but a_quantity。我希望当 a 重复时,它的数量应该与模型中的现有数量相加。

例如 id 我的输入是这样的:

bar     10

表格是这样的:

a   a_quantity

nar  27
bar  15
lar  10

那么当函数被调用时,它应该这样做:

a   a_quantity

nar  27
bar  25
lar  10

目前它会创建一个名称相同但数量不同的新条目。我怎样才能做到这一点 ?

标签: pythondjangodjango-views

解决方案


您在方法 [Django-doc]defaults=…的参数中设置更新值:.update_or_create(..)

for i in range(1, 9):
    foo.objects.update_or_create(
        a=data['a' + str(i)],
        defaults={'a_quantity': data['a_quantity' + str(i)])}
    )

或者您可以使用给定的值增加值a_quantity

from django.db.models import F

for i in range(1, 9):
    foo.objects.filter(
        a=data['a' + str(i)]
    ).update(
        a_quantity=F('a_quantity')+data['a_quantity' + str(i)]
    )

但是,我不确定这是一个好主意,因为人们通常旨在使 requests idempotent。如果不存在要更新的对象,我们可以创建一条记录:

from django.db.models import F

for i in range(1, 9):
    exists = foo.objects.filter(
        a=data['a' + str(i)]
    ).update(
        a_quantity=F('a_quantity')+data['a_quantity' + str(i)]
    )
    if not exists:
        foo.objects.create(a=data['a' + str(i)], a_quantity=data['a_quantity' + str(i)])

一些备注:

  1. a将字段定义为不可为空的唯一字段可能更有意义;
  2. 通常一个模型是用 写的PerlCase,所以Foo,不是foo
  3. 您可能想使用'a_quantity{}'.format(i)over 构造字符串;
  4. 在这里使用 arange(..)可能不是最好的选择,因为如果少于九个更新,它会引发错误,如果有更多,这些将不会被处理。

推荐阅读