Менеджеры django против прокси-моделей

В настоящее время я изучаю прокси-модели и не могу понять, когда мы должны проявлять к ним уважение. Для меня они очень похожи на менеджеров

Есть ли какие-то различия или мы можем реализовать то же самое, используя прокси-модели и менеджеры?

Идея заключается в том, что вы можете реализовать логику на модели и таким образом изменить поведение экземпляров модели.

Другими словами, вы можете использовать:

class User(models.Model):
    first_name = models.CharField(max_length=128)
    last_name = models.CharField(max_length=128)

    def __str__(self):
        return f'{self.first_name} {self.last_name}'


class ReverseUser(User):
    class Meta:
        proxy = True

    def __str__(self):
        return f'{self.last_name} {self.first_name}'

Так что ReverseUser.objects.all() и User.objects.all() нацелены на одну и ту же базу данных, по сути, делают один и тот же запрос, но будут по-разному представлены пользователям, если вы используете str(…) на них.

Менеджер занимается тем, что нужно получить, в то время как (прокси) модель занимается тем, что нужно сделать с полученными данными.

That being said, proxy models are rather rare. I think I have encounter them perhaps ~10-20 times., since it often does not make that much sense to start re-defining what to do with data. A use-case that I found interesting was that you can usually register a model only once for a ModelAdmin [Django-doc], but if you want to present the same records in multiple ModelAdmins, for example because some people are allowed to edit certain fields, or see others, that is quite complicated. A proxy model can be used then to present the same data in different model admins.

Менеджеры Django - это классы, которые управляют операциями запроса к базе данных по определенной модели. Джанго менеджер моделей

Прокси-модели позволяют создать новую модель, которая наследуется от существующей модели, но не создает новую таблицу базы данных. прокси-модель

Позвольте мне привести вам пример:

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    is_downloadable = models.BooleanField(default=True)

Если это ваша модель

менеджер:

class BookMnanger(models.Manager):
    def by_link(self):
        return self.filter(is_downloadable=True)

и вы новый менеджер:

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    is_downloadable = models.BooleanField(default=True)
    # your new manager should register to your model
    downloading = BookMnanger()

Теперь ваш новый пользовательский менеджер может работать следующим образом:

my_books = Book.downloading.all()
print(my_books)

но прокси:

class BookProxy(Book):
    class Meta:
        proxy = True

    def special_method(self):
        return f"{self.title} by {self.author}, published on {self.published_date}"

и ваш прокси может работать следующим образом:

book = BookProxy.objects.first() 
print(book.special_method()) 

Прокси - это способ изменить поведение вашей модели, но менеджеры изменят ваши конкретные запросы

Я могу дать вам больше ссылок о них, если вам нужно?

Вернуться на верх