python - 更新 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 a
is 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
目前它会创建一个名称相同但数量不同的新条目。我怎样才能做到这一点 ?
解决方案
您在方法 [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)])
一些备注:
a
将字段定义为不可为空的唯一字段可能更有意义;- 通常一个模型是用 写的
PerlCase
,所以Foo
,不是;foo
- 您可能想使用
'a_quantity{}'.format(i)
over 构造字符串; - 在这里使用 a
range(..)
可能不是最好的选择,因为如果少于九个更新,它会引发错误,如果有更多,这些将不会被处理。
推荐阅读
- firebase - MissingPluginException(在通道 plugins.flutter.io/firebase_auth 上找不到方法 signInWithCredential 的实现)
- sharepoint - SharePoint 2013“查找项目”搜索返回 null 的日期值
- c++ - 如何理解使用 std::memory_order_acquire 调用 compare_exchange_strong
- html - 如何处理角度应用程序中的本地化
- neo4j - neoclipse 连接错误:org.neo4j.rest.graphdb.RestResultException:需要括号来识别模式中的节点,
- python - 向量模块中的点积
- python-3.x - 生成自定义字母数字序列
- c# - 我删除了我的包文件夹,现在我无法在 VS2019 中构建
- bootstrap-4 - 覆盖 box-shadow 变量仅适用于 !important 标志
- c# - 在另一个线程中循环 ping + 更新 UI