我知道在django中我们可以通过使用类似的东西轻松创建对象模型
AbcModel.objects.create(field1='a', field2='b')
但即使它已经存在,这也会创建对象。
我知道我可以使用filter()
然后使用exist()
检查对象是否已经存在,然后决定更新或创建。
但有更简单快捷的方法吗?因为,有get_or_create
所以我很好奇是否有相似之处。
提前致谢
编辑: 我想到了这样的事情
new = AbcModel.objects.create(field1='a')
new[0].field2 = 'c'
new[0].save()
可能会有更多字段,而field1
并非总是a
可能是b
,c
和a
之类的其他字段。
如果有更简单快捷的方式而不是说get_or_create
无法得到我想要/需要的东西,那就好奇了
答案 0 :(得分:1)
正如你所说的那样get_or_create
,你可以这样做:
abc_instance, created = AbcModel.objects.get_or_create(field1='a', field2='b')
这将为您提供存在/创建的对象作为第一个参数,并将布尔值作为第二个参数,定义它是否已获取或创建。
此外,field1
和field2
将用于过滤器,但您可以设置defaults
属性,该属性将更新现有条目或用于创建条目。
abc_instance, created = AbcModel.objects.get_or_create(
field1='a', field2='b',
defaults={'field3': 'c', 'field4': 'd'}
)
答案 1 :(得分:0)
您可以使用update_or_create
:https://docs.djangoproject.com/en/2.0/ref/models/querysets/#update-or-create
但是,如果您过滤的字段不唯一,则最终可能会收到MultipleObjectsReturned
例外。
另一种方法可以是:
num_updated = AbcModel.objects.filter(field1='a').update(field2='c')
if num_updated == 0:
model = AbcModel.objects.create(field1='a', field2='c')
在num_updated
中,您将在第一行代码中更新行数。
我希望这有点帮助!