0
0 комментариев

В документации по Django приводится нижеследующая заметка:

You may be tempted to customize the model by overriding the init
method. If you do so, however, take care not to change the calling
signature as any change may prevent the model instance from being
saved. Rather than overriding init, try using one of these
approaches:

Add a classmethod on the model class:

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")

Add a method on a custom manager (usually preferred):

class BookManager(models.Manager):
    def create_book(self, title):
        book = self.create(title=title)
        # do something with the book
        return book
 
class Book(models.Model):
    title = models.CharField(max_length=100)
 
    objects = BookManager()
 
book = Book.objects.create_book("Pride and Prejudice")

Возможно подобный вопрос уже задавался, но всё же, в чём разница между созданием экземпляра модели через @classmethod и через Manager? Я хочу поглубже понять разницу между этими двумя подходами, и почему именно второй из них я является более предпочтительным.


Добавить комментарий