Django get_or_create 与 iexact 一起使用时无法设置字段
Django get_or_create fails to set field when used with iexact
我想将 name__iexact
与 get_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()
的参数中删除。
我想将 name__iexact
与 get_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()
的参数中删除。