如何在Django中使用“get_or_create()”?

mv1qrgav  于 2023-05-19  发布在  Go
关注(0)|答案(8)|浏览(143)

我尝试在表单中的某些字段中使用get_or_create(),但是当我尝试这样做时,我得到了500错误。
其中一行看起来像这样:

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

上面代码的错误是:
无法分配“(<Source: Website>,False)":“Customer.source”必须是“Source”示例。

ugmeyewa

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事件,则会考虑所有字段。

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

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

r7s23pms2#

get_or_create返回一个元组。

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

mccptt673#

get_or_create()返回一个元组:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created有一个布尔值,是否创建。
  • customer.source有一个get_or_create()方法的对象。
64jmpszr

64jmpszr4#

在@Tobu answer和@mipadi comment之后,以一种更pythonic的方式,如果对创建的标志不感兴趣,我会用途:

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

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

mm9b1k5b

mm9b1k5b6#

get_or_create方法实际上会返回一个元组。
get_or_create方法的诀窍在于它实际上返回(object,created)的元组。第一个元素是您试图检索的模型的示例,第二个元素是一个布尔标志,用于判断该示例是否已创建。True表示该示例是由get_or_create方法创建的,False表示它是从数据库中检索的
所以你可以做一些类似于获取源示例的事情

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

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()后面,如下所示:

# Here ↓↓↓
customer.source = Source.objects.get_or_create(name="Website")[0]
# object

如果你只需要一个布尔值而不需要一个对象,把[1]放在get_or_create()后面,如下所示:

# Here ↓↓↓
created = Source.objects.get_or_create(name="Website")[1]
# boolean
jgwigjjp

jgwigjjp8#

重要警告
在使用get_or_create,https://docs.djangoproject.com/en/4.0/ref/models/querysets/之前,您应该注意以下事项。....警告
假设数据库强制关键字参数的唯一性,则此方法是原子的(请参阅unique或unique_together)。如果关键字参数中使用的字段没有唯一性约束,则并发调用此方法可能会导致插入具有相同参数的多个行。

相关问题