Django, В чем преимущество модификации начального QuerySet менеджера моделей? - PullRequest
0 голосов
/ 02 августа 2020

В приведенной ниже модели есть EditorManager,

   
class EditorManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(role='E')

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    role = models.CharField(max_length=1, choices=[('A', _('Author')), ('E', _('Editor'))])
    people = models.Manager()
    editors = EditorManager()

Если я запрашиваю Person.objects.filter(role='E') или Person.editors.all(), я получаю тот же результат.

тогда, почему мы go для написания EditorManager ()?

Приведенный выше код взят из документации Django (https://docs.djangoproject.com/en/3.0/topics/db/managers/).

1 Ответ

1 голос
/ 02 августа 2020

Как указано в Документации :

с использованием нескольких менеджеров в одной модели. Вы можете прикрепить к модели столько экземпляров Manager(), сколько захотите. Это неповторяющийся способ определения общих «фильтров» для ваших моделей.

Поскольку у вас всего одно действие, вам может быть трудно увидеть преимущества. Однако по мере того, как ваш код становится больше, скажите:

good = Book.objects.filter(author="PersonA", stars=5).order_by("-date_created").exclude(outdated=True)
normal = Book.objects.filter(author="PersonA", stars=3).order_by("-date_created").exclude(outdated=True)
bad = Book.objects.filter(author="PersonA", stars=1).order_by("-date_created").exclude(outdated=True)

Вы можете видеть, что это очень много кода. С менеджерами вы можете сделать что-то вроде этого:

class AuthorAManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(author="PersonA").order_by("-date_created").exclude(outdated=True)

class Book(models.Model):
    # ...
    author_a = AuthorAManager()
good = Book.author_a.filter(stars=5)
normal = Book.author_a.filter(stars=3)
bad = Book.author_a.filter(stars=1)

В целом, это может сделать ваш код намного чище и понятнее. Как вы сказали, вы не видите разницы прямо сейчас, поскольку вы не входили в сложные / повторяющиеся дескрипторы, но по мере расширения вашего проекта я бы сказал, что это стоит вложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...