我尝试在表单中的某些字段中使用get_or_create(),但是当我尝试这样做时,我得到了500错误。其中一行看起来像这样:
get_or_create()
customer.source = Source.objects.get_or_create(name="Website")
上面代码的错误是:无法分配“(<Source: Website>,False)":“Customer.source”必须是“Source”示例。
ugmeyewa1#
从文档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事件,则会考虑所有字段。
defaults
看起来你需要返回一个元组,而不是一个变量,像这样做:
customer.source,created = Source.objects.get_or_create(name="Website")
r7s23pms2#
get_or_create返回一个元组。
get_or_create
customer.source, created = Source.objects.get_or_create(name="Website")
mccptt673#
get_or_create()返回一个元组:
created
customer.source
64jmpszr4#
在@Tobu answer和@mipadi comment之后,以一种更pythonic的方式,如果对创建的标志不感兴趣,我会用途:
customer.source, _ = Source.objects.get_or_create(name="Website")
m4pnthwp5#
您遇到的问题是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
customer.source = Source.objects.get_or_create(name="Website")[0]
mm9b1k5b6#
get_or_create方法实际上会返回一个元组。get_or_create方法的诀窍在于它实际上返回(object,created)的元组。第一个元素是您试图检索的模型的示例,第二个元素是一个布尔标志,用于判断该示例是否已创建。True表示该示例是由get_or_create方法创建的,False表示它是从数据库中检索的所以你可以做一些类似于获取源示例的事情
``` customer.source = Source.objects.get_or_create(name="Website")[0]
xqkwcwgp7#
get_or_create()返回包含2个值的元组,第一个值是an object,第二个值是布尔值,表示是否创建了新对象,如下所示:
# 1st # 2nd (object, boolean)
所以,如果你想要一个对象和一个布尔值,在customer.source后面再放一个变量created,如下所示:
# Here customer.source, created = Source.objects.get_or_create(name="Website") # object # boolean
并且,如果你只想要一个没有布尔值的对象,把[0]放在get_or_create()后面,如下所示:
[0]
# Here ↓↓↓ customer.source = Source.objects.get_or_create(name="Website")[0] # object
如果你只需要一个布尔值而不需要一个对象,把[1]放在get_or_create()后面,如下所示:
[1]
# Here ↓↓↓ created = Source.objects.get_or_create(name="Website")[1] # boolean
jgwigjjp8#
重要警告在使用get_or_create,https://docs.djangoproject.com/en/4.0/ref/models/querysets/之前,您应该注意以下事项。....警告假设数据库强制关键字参数的唯一性,则此方法是原子的(请参阅unique或unique_together)。如果关键字参数中使用的字段没有唯一性约束,则并发调用此方法可能会导致插入具有相同参数的多个行。
8条答案
按热度按时间ugmeyewa1#
从文档get_or_create:
**说明:**要进行相似性评估的字段必须在
defaults
之外提及。其余字段必须包含在defaults
中。如果发生CREATE事件,则会考虑所有字段。看起来你需要返回一个元组,而不是一个变量,像这样做:
r7s23pms2#
get_or_create
返回一个元组。mccptt673#
get_or_create()
返回一个元组:created
→有一个布尔值,是否创建。customer.source
→有一个get_or_create()
方法的对象。64jmpszr4#
在@Tobu answer和@mipadi comment之后,以一种更pythonic的方式,如果对创建的标志不感兴趣,我会用途:
m4pnthwp5#
您遇到的问题是
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
mm9b1k5b6#
get_or_create方法实际上会返回一个元组。
get_or_create方法的诀窍在于它实际上返回(object,created)的元组。第一个元素是您试图检索的模型的示例,第二个元素是一个布尔标志,用于判断该示例是否已创建。True表示该示例是由get_or_create方法创建的,False表示它是从数据库中检索的
所以你可以做一些类似于获取源示例的事情
xqkwcwgp7#
get_or_create()返回包含2个值的元组,第一个值是an object,第二个值是布尔值,表示是否创建了新对象,如下所示:
所以,如果你想要一个对象和一个布尔值,在
customer.source
后面再放一个变量created
,如下所示:并且,如果你只想要一个没有布尔值的对象,把
[0]
放在get_or_create()
后面,如下所示:如果你只需要一个布尔值而不需要一个对象,把
[1]
放在get_or_create()
后面,如下所示:jgwigjjp8#
重要警告
在使用get_or_create,https://docs.djangoproject.com/en/4.0/ref/models/querysets/之前,您应该注意以下事项。....警告
假设数据库强制关键字参数的唯一性,则此方法是原子的(请参阅unique或unique_together)。如果关键字参数中使用的字段没有唯一性约束,则并发调用此方法可能会导致插入具有相同参数的多个行。