问题:使用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.
回答 0
从文档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")
回答 1
get_or_create
返回一个元组。
customer.source, created = Source.objects.get_or_create(name="Website")
回答 2
get_or_create()
返回一个元组:
customer.source, created = Source.objects.get_or_create(name="Website")
created
→是否创建布尔值。customer.source
→有一个get_or_create()
方法的对象。
回答 3
在@Tobu答案和@mipadi注释之后,以更加Python化的方式,如果对创建的标志不感兴趣,我将使用:
customer.source, _ = Source.objects.get_or_create(name="Website")
回答 4
您遇到的问题是的已记录功能get_or_create
。
当使用除“默认值”以外的关键字参数时,的返回值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