Django-更新或创建
我有一个模特:-Django-更新或创建,django,django-queryset,Django,Django Queryset,我有一个模特:- class XYZ(models.Model): unique_col = models.CharField(max_length=255) total = models.IntegerField() 我想通过+10更新总数,给定唯一列值。因此,我做了以下工作:- try: obj = XYZ.objects.get(unique_col='unique_value') obj.total +=10 except: obj = XYZ(
class XYZ(models.Model):
unique_col = models.CharField(max_length=255)
total = models.IntegerField()
我想通过+10
更新总数,给定唯一列
值。因此,我做了以下工作:-
try:
obj = XYZ.objects.get(unique_col='unique_value')
obj.total +=10
except:
obj = XYZ(unique_col='unique_value', total=10)
finally:
obj.save()
在这种情况下,如何使用
update\u或\u create
将total
更新为先前值的+10
。问题在于,如果update\u或\u create
需要创建对象,您不知道total
的值。如果您这样指定默认值
class XYZ(models.Model):
unique_col = models.CharField(max_length=255)
total = models.IntegerField(default=0)
然后,您可以运行get_或_create,并在之后执行更新
obj, created = XYZ.objects.get_or_create(unique_col='unique_value')
obj.total += 10
obj.save()
如果您真的想使用更新或创建方法,尽管它不会使用更新或创建方法,但它至少让您不再需要尝试/例外,如果这是您希望避免的,2020年更新的答案: 罗伯特回答的概念是正确的,但我必须以以下方式对其进行修改,以便为我工作: 将“总计”的默认值设置为零:
class XYZ(models.Model):
...
total = models.IntegerField(default=0)
设置obj,创建而不仅仅是obj
obj, created = XYZ.objects.get_or_create(unique_col='unique_value')
obj.total += 10
obj.save()
请参见默认值应为0,否则创建后它将包含值20。如果您修改对象的定义,则保存时会出现错误。obj,created=XYZ.objects.get_或_create(unique_col='unique_value')我错过了,你完全正确。我刚刚更新了答案这实际上是正确的答案,“obj,created”在这里非常重要