Django:对.get()检索的单个模型实例调用.update()?

2024-04-24 16:50:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,它当前调用Models.object.get(),返回0或1个模型对象。如果返回0,则在函数的except DoesNotExist子句中创建一个新的模型实例。否则,我想在不创建新实例的情况下更新现有实例中的字段。我最初试图在找到的实例上调用.update(),但是.update()似乎只能在queryset上调用。如何在不调用.filter()和比较长度以知道是否必须创建或更新预先存在的实例的情况下,绕过更改十几个字段?


Tags: 对象实例函数模型getobjectmodels情况
3条回答

从Django 1.5开始,model save上有一个update_fields属性。例如:

obj.save(update_fields=['field1', 'field2', ...])

https://docs.djangoproject.com/en/dev/ref/models/instances/

我更喜欢这种方法,因为如果有多个web应用实例更改模型实例的不同部分,它不会产生原子性问题。

如果只想更新模型(如果存在)(而不创建模型),请执行以下操作:

Model.objects.filter(id = 223).update(field1 = 2)

mysql查询:

UPDATE `model` SET `field1` = 2 WHERE `model`.`id` = 223

随着Django 1.7的出现,现在有了一个新的^{}QuerySet方法,它应该完全按照您的要求来做。如果没有在数据库级别强制实现唯一性,请小心潜在的竞争条件。

文档中的示例:

obj, created = Person.objects.update_or_create(
    first_name='John', last_name='Lennon',
    defaults={'first_name': 'Bob'},
)

The update_or_create method tries to fetch an object from database based on the given kwargs. If a match is found, it updates the fields passed in the defaults dictionary.


Django 1.7之前:

根据需要更改模型字段值,然后调用.save()来保持更改:

try:
    obj = Model.objects.get(field=value)
    obj.field = new_value
    obj.save()
except Model.DoesNotExist:
    obj = Model.objects.create(field=new_value)
# do something else with obj if need be

相关问题 更多 >