Об’єкти менеджера моделей Django. Створити де знаходиться документація?


85

Я завжди читаю, що слід використовувати

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 Я отримав свою відповідь дуже щасливий. Я також шукав без результату, тому запитав.
Sam Stoelinga

Відповіді:



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.