我试图使用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方法的诀窍在于它实际上返回(object, created)的元组。第一个元素是您试图检索的模型的实例,第二个元素是一个布尔标志,用于判断实例是否已创建。True表示该实例是由get_or_create方法创建的,False表示该实例是从数据库检索的

你可以做一些事情,比如获取源实例

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

其他回答

在@Tobu回答和@mipadi评论之后,以一种更python的方式,如果对创建的标志不感兴趣,我会使用:

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

Get_or_create返回一个元组。

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

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()返回一个元组:

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

Created→有一个布尔值,是否创建。 客户。Source→有一个get_or_create()方法对象。

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

解释: 要评估相似度的字段必须在默认值之外提到。其余字段必须包含在默认值中。如果发生CREATE事件,将考虑所有字段。

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

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