Менеджеры 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())
Прокси - это способ изменить поведение вашей модели, но менеджеры изменят ваши конкретные запросы
Я могу дать вам больше ссылок о них, если вам нужно?