与 iexact 一起使用时,Django get_or_create 无法设置字段
Posted
技术标签:
【中文标题】与 iexact 一起使用时,Django get_or_create 无法设置字段【英文标题】:Django get_or_create fails to set field when used with iexact 【发布时间】:2015-05-31 04:17:31 【问题描述】:我想将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 错误?
【问题讨论】:
【参考方案1】:根据documentation,可以尝试使用默认args(这段代码没试过):
p1, c1 = Provider.objects.get_or_create(
defaults='name':"Timber",
name__iexact="Timber"
)
这是有道理的,因为您可以进行不同的搜索和对象创建。
【讨论】:
【参考方案2】:你看到的是正确的行为。
get_or_create
是“获取并返回匹配kwargs
的对象,如果不存在,则使用defaults
创建它”的简写。您的查找正在寻找一个对象,其中name
是与'cedar'
不区分大小写的匹配项。该对象存在,所以它被返回。不多也不少。
现在如果没有匹配,Stéphane 是对的,您需要在 defaults
参数中指定 name
。所有包含查找分隔符__
的查找都从传递给create()
的参数中删除。
【讨论】:
啊哈。最后一句话是关键。它在文档中:docs.djangoproject.com/en/1.7/ref/models/querysets/…for k, v in kwargs.items() if '__' not in k
以上是关于与 iexact 一起使用时,Django get_or_create 无法设置字段的主要内容,如果未能解决你的问题,请参考以下文章
如何链接 Django 的“in”和“iexact”查询集字段查找?