繁体   English   中英

使用 get_or_create 的正确方法?

[英]Correct way to use get_or_create?

我正在尝试对表单中的某些字段使用 get_or_create,但是当我尝试这样做时出现 500 错误。

其中一行如下所示:

customer.source = Source.objects.get_or_create(name="Website")

我得到的上述代码的错误是:

Cannot assign "(<Source: Website>, False)": "Customer.source" 
   must be a "Source" instance.

从文档get_or_create

# get_or_create() a person with similar first names.

p, created = Person.objects.get_or_create(
    first_name='John',
    last_name='Lennon',
    defaults={'birthday': date(1940, 10, 9)},
)

# get_or_create() didn't have to create an object.
>>> created
False

说明:要评估相似性的字段,必须在defaults之外提及。 其余字段必须包含在defaults 如果发生 CREATE 事件,则会考虑所有字段。

看起来您需要返回一个元组,而不是单个变量,请执行以下操作:

customer.source,created = Source.objects.get_or_create(name="Website")

get_or_create返回一个元组。

customer.source, created = Source.objects.get_or_create(name="Website")

get_or_create()返回一个元组:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created 有一个布尔值,是否创建。

  • customer.source 有一个get_or_create()方法的对象。

遵循@Tobu 的回答和@mipadi 的评论,以更pythonic 的方式,如果对创建的标志不感兴趣,我会使用:

customer.source, _ = Source.objects.get_or_create(name="Website")

您遇到的问题是get_or_create的记录功能。

当使用“defaults”以外的关键字参数时, get_or_create的返回值是一个实例。 这就是为什么它向您显示返回值中的括号。

您可以使用customer.source = Source.objects.get_or_create(name="Website")[0]来获得正确的值。

这是文档的链接: http : //docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

get_or_create 方法实际上会返回一个元组。

get_or_create 方法的诀窍在于它实际上返回一个 (object, created) 的元组。 第一个元素是您尝试检索的模型的实例,第二个元素是一个布尔标志,用于判断该实例是否已创建。 True 表示实例是通过 get_or_create 方法创建的,False 表示它是从数据库中检索的

所以你可以做一些事情来获取源实例

 ```   customer.source = Source.objects.get_or_create(name="Website")[0]
 ```

重要警告。

在使用 get_or_create 之前,您应该注意以下事项, https: //docs.djangoproject.com/en/4.0/ref/models/querysets/。 .... 警告

此方法是原子的,假设数据库强制执行关键字参数的唯一性(请参阅 unique 或 unique_together)。 如果关键字参数中使用的字段没有唯一性约束,则对该方法的并发调用可能会导致插入具有相同参数的多行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM