owe*_*nfi 21 python django postgresql django-models
我想使用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''
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是对的,你需要name
在defaults
参数中指定.包含查找分隔符的所有查找__
都将从传递给的参数中删除create()
.
Sté*_*ane 13
根据文档,您可以尝试使用默认args(没有尝试此代码):
p1, c1 = Provider.objects.get_or_create(
defaults={'name':"Timber"},
name__iexact="Timber"
)
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为您可以进行搜索和不同的对象创建.
归档时间: |
|
查看次数: |
3426 次 |
最近记录: |