gpt4 book ai didi

python - 更新 django 模型中的对象

转载 作者:行者123 更新时间:2023-12-01 00:17:00 24 4
gpt4 key购买 nike

我的应用程序中有一个名为 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)])

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

对于例如 id,我的输入是这样的:

bar     10

表格是这样的:

a   a_quantity

nar 27
bar 15
lar 10

那么当调用该函数时,它应该执行以下操作:

a   a_quantity

nar 27
bar 25
lar 10

目前,它创建了一个具有相同名称和不同数量的新条目。我该如何做到这一点?

最佳答案

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

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

或者您可以使用给定的 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)]
)

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

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 字段定义为不可为 NULL唯一 字段可能更有意义;
  2. 通常模型是用 PerlCase 编写的,因此 Foo,而不是 foo
  3. 您可能希望使用 'a_quantity{}'.format(i) 来构建字符串;
  4. 使用 range(..) 可能不是最好的选择,因为如果更新少于九个,则会引发错误,如果有更多,则不会已处理。

关于python - 更新 django 模型中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59265206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com