Django get_or_create 与 iexact 一起使用时无法设置字段

Django get_or_create fails to set field when used with iexact

我想将 name__iexactget_or_create 一起使用,以避免在可能的情况下重复用户输入的字段。

我的 Provider 模型有一个我在 get_or_create 中使用的名称字段。

查找工作正常,但是第一次创建实例时,如下面的 p1/Timber 示例(名称

失败:

>>> p1, c1 = Provider.objects.get_or_create(name__iexact="Timber")
>>> p1, c1
(<Provider: >, True)
>>> p1.name
u''

此处按预期工作:

>>> p2, c2 = Provider.objects.get_or_create(name="Cedar")
>>> p2.name, c2
('Cedar', True)
>>> p3, c3 = Provider.objects.get_or_create(name__iexact="Cedar")
>>> p3, c3
(<Provider: Cedar>, False)
>>> Provider.objects.get_or_create(name__iexact="cedar")
(<Provider: Cedar>, False)

__iexact 是否与 get_or_create 的创建部分不兼容,这是预期的行为(以及为什么),还是我 运行 遇到了 Django 错误?

根据documentation,你可以尝试使用默认参数(没试过这段代码):

p1, c1 = Provider.objects.get_or_create(
   defaults={'name':"Timber"}, 
   name__iexact="Timber"
)

这是有道理的,因为您可以进行不同的搜索和对象创建。

您看到的是正确的行为。

get_or_create is shorthand for 'get and return the object matching kwargs, if it doesn't exist, create it using defaults' .您的查找正在寻找一个对象,其中 name 是与 'cedar' 的不区分大小写的匹配项。该对象存在,所以它是 returned。仅此而已。

现在如果没有匹配项,Stéphane 是对的,您需要在 defaults 参数中指定 name。所有包含查找分隔符 __ 的查找都从传递给 create() 的参数中删除。