Django - update_or_create

时间:2016-06-04 15:42:18

标签: django django-queryset

我是一个模特: -

class XYZ(models.Model):
    unique_col = models.CharField(max_length=255)
    total = models.IntegerField()

我想更新总数,unique_col+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()

在这种情况下,如何使用total+10更新为之前值update_or_create

2 个答案:

答案 0 :(得分:4)

问题是,在total需要创建对象的情况下,您不知道update_or_create的值。如果指定默认值

class XYZ(models.Model):
    unique_col = models.CharField(max_length=255)
    total = models.IntegerField(default=0)

然后你可以运行get_or_create并在之后进行更新。

obj = XYZ.objects.get_or_create(unique_col='unique_value')
obj.total += 10
obj.save()

当然,如果您真的想使用它,则不使用update_or_create方法,但它至少可以让您不需要try / except,如果这是您希望避免的那样

答案 1 :(得分:1)

2020年的最新答案: 罗伯特答案的概念是正确的,但我必须通过以下方式对其进行修改才能为我工作:

将总计默认设置为零:

class XYZ(models.Model):
    ...
    total = models.IntegerField(default=0)

不仅将obj, created设置为obj

obj, created = XYZ.objects.get_or_create(unique_col='unique_value')
obj.total += 10
obj.save()

请参见https://docs.djangoproject.com/en/3.0/ref/models/querysets/#get-or-create