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”在这里非常重要