使用get_or_create的正确方法?


203

我正在尝试对表单中的某些字段使用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.

Answers:


353

从文档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")

3
仅供参考,它是布尔值。如果创建,则为True,如果获取则为False
乔什(Josh)

3
额外save()的多余吗?
zypro

@zypro就像create()创建对象并将其保存在一个步骤中,不需要任何操作save()
Amin Mir

32

get_or_create 返回一个元组。

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

16
或者,如果您不关心布尔值标志:customer.source = Source.objects.get_or_create(name="Website")[0]
mipadi

7
@mipadi我更喜欢customer.source, _ = Source.objects.get_or_create(name="Website"),因为它使得返回元组的事实更加明显,从而有助于避免将来的错误。
所罗门·乌科

15

get_or_create() 返回一个元组:

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

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


12

在@Tobu答案和@mipadi注释之后,以更加Python化的方式,如果对创建的标志不感兴趣,我将使用:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.