正确使用get_or_create的方法?

时间:2009-12-21 16:43:54

标签: django

我正在尝试将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.

6 个答案:

答案 0 :(得分:303)

来自文档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 :(得分:30)

get_or_create返回一个元组。

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

答案 2 :(得分:13)

get_or_create()返回一个元组:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created 有一个布尔值,是否已创建。

  • customer.source 的对象为get_or_create()方法。

答案 3 :(得分:11)

关注@Tobu回答和@mipadi评论,以更加pythonic的方式,如果对创建的标志不感兴趣,我会使用:

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

答案 4 :(得分:4)

您遇到的问题是get_or_create的记录功能。

当使用“defaults”以外的关键字参数时,get_or_create的返回值是一个实例。这就是为什么它会向你显示返回值中的parens。

您可以使用customer.source = Source.objects.get_or_create(name="Website")[0]来获取正确的值。

以下是文档的链接: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

答案 5 :(得分:0)

get_or_create 方法实际上会返回一个元组。

get_or_create 方法的诀窍在于它实际上返回一个 (object, created) 的元组。第一个元素是您尝试检索的模型的实例,第二个元素是一个布尔标志,用于判断该实例是否已创建。 True 表示实例是通过 get_or_create 方法创建的,False 表示它是从数据库中获取的

所以你可以做一些事情来获取源实例

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