Правильный способ использования get_or_create?

Я пытаюсь использовать 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.

Ответ 1

Из документации 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

Похоже, вам нужно возвращаться в кортеж, а не одну переменную, сделайте вот так:

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

Ответ 2

get_or_create возвращает кортеж.

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

Ответ 3

get_or_create() возвращает кортеж,

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

Здесь создан = > имеет логическое значение, создается или нет

client.source = > имеет объект метода get_or_create().

Вот ссылка на документацию: http://docs.djangoproject.com/en/dev/ref/models/querysets/#get-or-create-kwargs

Ответ 4

Проблема, с которой вы сталкиваетесь, является документированной функцией get_or_create.

При использовании аргументов ключевого слова, отличных от "по умолчанию", возвращаемое значение 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

После ответа @Tobu и комментария @mipadi, более питоническим способом, если он не заинтересован в созданном флаге, я бы использовал:

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