【问题标题】:Django get_or_create fails to set field when used with iexact与 iexact 一起使用时,Django get_or_create 无法设置字段
【发布时间】: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 错误?

【问题讨论】:

    标签: python django postgresql django-models


    【解决方案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() 的参数中删除。

      【讨论】:

      猜你喜欢
      • 2011-12-14
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2021-12-26
      • 2013-12-20
      • 2021-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多