Правильный способ использования 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")