Сохраняет ли метод create() объект модели в базе данных Django?

Я только что столкнулся с использованием create методов в подклассе Djangos models.Model. В Документации есть такой пример кода:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)

    @classmethod
    def create(cls, title):
        book = cls(title=title)
        # do something with the book
        return book

book = Book.create("Pride and Prejudice")

Это уже сохраняет новый Book объект в базу данных? Интуиция подсказывает, что метод save() должен вызываться в строке # do something with the book, иначе он не будет работать. Однако, когда я пытаюсь протестировать его, кажется, что добавление к нему save() ни на что не влияет. Почему так происходит и как на самом деле происходит сохранение объекта в базу данных?

PS. Я столкнулся с этим, пытаясь изучить тестирование с помощью TestCase. Если метод classmethod не сохраняет ничего в базу данных, проблема, вероятно, в моем коде тестирования, но это уже совсем другой вопрос.

Это уже сохраняет новый Book объект в базу данных?

Нет, он просто создает объект Book с заданным названием, но он не сохраняется в базе данных, поэтому вы должны сохранить его:

book = Book.create('Pride and Prejudice')
book.save()

возможно, лучше работать с .objects.create(…) [Django-doc], это вызовет сохранение с force_insert=True, что немного оптимизирует вставку в базу данных:

class Book(models.Model):
    title = models.CharField(max_length=100)

    @classmethod
    def create(cls, title):
        # will store this in the database
        book = cls.objects.create(title=title)
        # do something with the book
        return book

или с:

class Book(models.Model):
    title = models.CharField(max_length=100)

    @classmethod
    def create(cls, title):
        book = cls(title=title)
        # will store this in the database
        book.save(force_insert=True)
        # do something with the book
        return book
Вернуться на верх