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