Правильный способ использовать get_or_create? - PullRequest
172 голосов
/ 21 декабря 2009

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

Ответы [ 5 ]

309 голосов
/ 21 декабря 2009

Из документации 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")
30 голосов
/ 21 декабря 2009

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

customer.source, created = Source.objects.get_or_create(name="Website")
13 голосов
/ 28 октября 2013

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

customer.source, created  = Source.objects.get_or_create(name="Website")
  • created имеет логическое значение, создано или нет.

  • customer.source имеет объект метода get_or_create().

11 голосов
/ 26 сентября 2017

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

customer.source, _ = Source.objects.get_or_create(name="Website")
4 голосов
/ 21 декабря 2009

Проблема, с которой вы столкнулись, является документированной функцией 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...