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

owe*_*nfi 21 python django postgresql django-models

我想使用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''
Run Code Online (Sandbox Code Playgroud)

按预期工作:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

__iexact用的创建部分不兼容get_or_create,这是预期的行为(为什么),或者我已经运行到一个Django的bug?

knb*_*nbk 20

你所看到的是正确的行为.

get_or_create是'获取并返回对象匹配的简写kwargs,如果它不存在,则使用defaults' 创建它.您的查找正在寻找一个name不区分大小写的对象'cedar'.该对象存在,因此返回.没有更多,没有更少.

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

  • 啊哈。最后一句话是关键。这是在文档中: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#get-or-create `for k, v in kwargs.items() if '__' not in k` (3认同)

Sté*_*ane 13

根据文档,您可以尝试使用默认args(没有尝试此代码):

p1, c1 = Provider.objects.get_or_create(
   defaults={'name':"Timber"}, 
   name__iexact="Timber"
)
Run Code Online (Sandbox Code Playgroud)

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