Django model manager objects.create где документация?


86

Я всегда читаю, что мне следует использовать

model = Model(a=5, b=6)
model.save()

Но я только что увидел, что есть функция менеджера, потому что я видел, как приложение django с открытым исходным кодом использует ее.

model = Model.objects.create(a=5, b=6)
print model.pk
1

Так предлагается ли его использовать? Или все же предпочтительнее использовать метод .save. Я предполагаю, что objects.create попытается создать его несмотря ни на что, тогда как save может сохранить существующий объект, если указан pk.

Это документы, которые я нашел: https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects


11
почему этот вопрос получил голосование против? я только что пришел сюда с тем же вопросом и нашел это полезным.
Ferguzz

4
Я тоже не знала, может, люди думали, что это глупо и очевидно. Плевать на это: P Я получил свой ответ, я счастлив. Я тоже искал безрезультатно, поэтому спросил.
Сэм Стулинга

Ответы:



44
p = Person.objects.create(first_name="Bruce", last_name="Springsteen")

эквивалент:

p = Person(first_name="Bruce", last_name="Springsteen") 
p.save(force_insert=True)

Force_insert означает, что всегда будет создаваться новый объект.
Обычно вам не нужно об этом беспокоиться. Однако, если ваша модель содержит значение первичного ключа, которое вы установили вручную, и если это значение уже существует в базе данных, вызов create () завершится ошибкой IntegrityError, поскольку первичные ключи должны быть уникальными. Будьте готовы обработать исключение, если вы используете ручные первичные ключи.


3

create по сути делает то же самое. ниже - исходный код для создания.

def create(self, **kwargs):
    """
    Creates a new object with the given kwargs, saving it to the database
    and returning the created object.
    """
    obj = self.model(**kwargs)
    self._for_write = True
    obj.save(force_insert=True, using=self.db)
    return obj

он создает экземпляр, а затем сохраняет его.


1

По сути, эти два метода эквивалентны . Использование Model.objects.createможет быть предпочтительным, поскольку оно больше соответствует стилю Django.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.