是否有任何理由使用"如果不是***。filter()。exists():***。create()"而不是" ***。get_or_create()"?

时间:2016-10-06 22:29:31

标签: django django-queryset

我找不到答案,使用起来会更快:

if not Model.objects.filter(*some_data*).exists():
    Model.objects.create(*some_data*)

然后:

Model.objects.get_or_create(*some_data*)

有人知道吗?

1 个答案:

答案 0 :(得分:1)

get_or_create

  

使用给定的kwargs查找对象的便捷方法   (如果您的模型具有所有字段的默认值,则可能为空),创建一个   如果有必要的话。

所以至少你违反了DRY校长。除此之外,您正在检查模型中的所有字段,而不仅仅是主键或唯一字段。您将尝试查找所有字段匹配的对象。所以很有可能你会得到错误的结果,你的创建语句也会失败。这就是为什么get_or_create具有defaults参数

的原因