Я пытаюсь использовать 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.
save()
лишний лишний?create()
создание объекта и сохранение всего этого за один шаг и не нужноsave()
get_or_create
возвращает кортежисточник
customer.source = Source.objects.get_or_create(name="Website")[0]
customer.source, _ = Source.objects.get_or_create(name="Website")
, так как это делает факт, что кортеж был возвращен более очевидным, помогая избежать будущих ошибок.get_or_create()
возвращает кортеж:created
→ имеет логическое значение, создано или нет.customer.source
→ имеет объектget_or_create()
метода.источник
После ответа @Tobu и комментария @mipadi более питонным образом, если бы меня не интересовал созданный флаг, я бы использовал:
источник
Проблема, с которой вы столкнулись, является задокументированной особенностью
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
источник