是否有更简单的方法来创建或重写现有对象? Django的

时间:2017-05-15 18:14:09

标签: python django object

我知道在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可能是bca之类的其他字段。

如果有更简单快捷的方式而不是说get_or_create无法得到我想要/需要的东西,那就好奇了

2 个答案:

答案 0 :(得分:1)

正如你所说的那样get_or_create,你可以这样做:

abc_instance, created = AbcModel.objects.get_or_create(field1='a', field2='b')

这将为您提供存在/创建的对象作为第一个参数,并将布尔值作为第二个参数,定义它是否已获取或创建。

此外,field1field2将用于过滤器,但您可以设置defaults属性,该属性将更新现有条目或用于创建条目。

abc_instance, created = AbcModel.objects.get_or_create(
    field1='a', field2='b',
    defaults={'field3': 'c', 'field4': 'd'}
)

答案 1 :(得分:0)

您可以使用update_or_createhttps://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中,您将在第一行代码中更新行数。

我希望这有点帮助!