Я хочу создать объект модели, например Person, если идентификатор человека не существует, или я получу этот объект человека.
Код для создания нового человека выглядит следующим образом:
class Person(models.Model):
identifier = models.CharField(max_length = 10)
name = models.CharField(max_length = 20)
objects = PersonManager()
class PersonManager(models.Manager):
def create_person(self, identifier):
person = self.create(identifier = identifier)
return person
Но я не знаю, где проверить и получить существующий объект person.
python
django
django-models
user1687717
источник
источник
QuerySet
имеетupdate_or_create
Неясно, запрашивает ли ваш вопрос метод get_or_create (доступный как минимум в Django 1.3) или метод update_or_create (новый в Django 1.7). Это зависит от того, как вы хотите обновить объект пользователя.
Пример использования следующий:
источник
update_or_create
потому что для этого варианта использования лучше, чемget_or_create
просто снова вызватьsave()
объект.Person.objects.get_or_create(a=a, b=b, c=c, defaults={"name": name})
defaults
аргумент этих функций - это то место, где вы указываете, какие поля вы хотите добавить в модель. Это не имеет ничего общего со значениями по умолчанию, указанными в полях вашей моделиDjango поддерживает это, проверьте get_or_create
источник
Только для небольшого количества объектов update_or_create работает хорошо, но если вы работаете с большой коллекцией, он не будет хорошо масштабироваться. update_or_create всегда сначала запускает SELECT, а затем UPDATE.
В лучшем случае это будет запускать только первый запрос обновления, и только если он соответствует нулевым строкам, запускает другой запрос INSERT. Это значительно увеличит вашу производительность, если вы ожидаете, что большинство строк действительно существует.
Однако все сводится к вашему варианту использования. Если вы ожидаете в основном вставок, то, возможно, в качестве варианта может быть использована команда bulk_create () .
источник
Подумал, что добавлю ответ, так как заголовок вашего вопроса выглядит так, будто спрашивает, как создать или обновить, а не получить или создать, как описано в теле вопроса.
Если вы действительно хотите создать или обновить объект, метод .save () уже имеет это поведение по умолчанию, из документации :
Стоит отметить, что когда они говорят «если ОБНОВЛЕНИЕ ничего не обновляло», они по существу имеют в виду случай, когда идентификатор, который вы дали объекту, еще не существует в базе данных.
источник
Если один из входных данных при создании является первичным ключом, этого будет достаточно:
Он будет автоматически обновляться, если существует, поскольку два данных с одним и тем же первичным ключом не допускаются.
источник