正确的方式来使用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 

它看起来像你需要返回到一个元组,而不是一个单一的variables,这样做:

 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 =>有一个布尔值,是否创build

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

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

您遇到的问题是get_or_create的loggingfunction。

当使用“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

在@Tobu回答和@mipadi评论之后,如果对创build的标志不感兴趣,可以采用更为pythonic的方式:

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