回答:
ドキュメントから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")
save()
は冗長ですか?
create()
、オブジェクトを作成して1つのステップですべてを保存し、何も必要としないようなものですsave()
get_or_create
タプルを返します。
customer.source, created = Source.objects.get_or_create(name="Website")
customer.source = Source.objects.get_or_create(name="Website")[0]
customer.source, _ = Source.objects.get_or_create(name="Website")
、タプルが返されたという事実をより明確にし、将来のバグを回避するのに役立つため、私は好みます。
get_or_create()
タプルを返します:
customer.source, created = Source.objects.get_or_create(name="Website")
created
→ブール値を持っているか、作成されているかどうか。
customer.source
→get_or_create()
メソッドのオブジェクトを持っています。
発生している問題は、の文書化された機能です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