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

317 投票
8 回答
346668 浏览
提问于 2025-04-15 17:15

我正在尝试在我的表单中使用 get_or_create(),但是每次这样做时都会出现500错误。

其中一行代码是这样的:

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

我在上面的代码中遇到的错误是:

无法分配 "(<Source: Website>, False)": "Customer.source" 必须是一个 "Source" 实例。

8 个回答

33

get_or_create() 方法会返回一个元组:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created 是一个布尔值,表示是否新创建了一个对象。

  • customer.source 是通过 get_or_create() 方法得到的对象。

42

get_or_create 这个函数会返回一个元组。

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

根据文档中的说明 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 中。如果发生创建事件,所有字段都会被考虑在内。

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

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

撰写回答