get_or_createの正しい使い方は?


203

フォームの一部のフィールドでget_or_createを使用しようとしていますが、実行しようとすると500エラーが発生します。

行の1つは次のようになります。

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

上記のコードで発生するエラーは次のとおりです。

Cannot assign "(<Source: Website>, False)": "Customer.source" 
   must be a "Source" instance.

回答:


353

ドキュメントから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")

3
作成したFYIはブール値です。作成された場合はTrue、フェッチされた場合はFalse
Josh

3
追加save()は冗長ですか?
zypro

@zyproはcreate()、オブジェクトを作成して1つのステップですべてを保存し、何も必要としないようなものですsave()
Amin Mir

32

get_or_create タプルを返します。

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

16
または、ブールフラグを気にしない場合:customer.source = Source.objects.get_or_create(name="Website")[0]
mipadi

7
@mipadiはcustomer.source, _ = Source.objects.get_or_create(name="Website")、タプルが返されたという事実をより明確にし、将来のバグを回避するのに役立つため、私は好みます。
ソロモンウッコ

15

get_or_create() タプルを返します:

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created ブール値を持っているか、作成されているかどうか。

  • customer.source get_or_create()メソッドのオブジェクトを持っています。


12

@Tobuの回答と@mipadiのコメントに続いて、作成されたフラグに興味がない場合は、次のように使用します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.