django - Создание пользовательского набора запросов для RelatedManager - PullRequest
0 голосов
/ 24 июня 2019

Я перепробовал около 25 ссылок Stackoverflow, и похоже, что ни у кого нет работающего решения этой проблемы.

Я создал пользовательский набор запросов, подобный этому:

class ProjectQuerySet(models.QuerySet):
   def get_active(self):
       from apps.projectmanagement.models import Project
       return self.filter(active=True)

class ProjectManager(models.Manager):
  def get_queryset(self):
      return ProjectQuerySet(self.model, using=self._db)

Это прекрасно работает, если я начну с модели, как

Project.objects.get_active()

Но если я захочу использовать это в отношениях, пока не повезет:

employee.projects.get_active()

Я всегда получаю эту ошибку:

AttributeError: у объекта «ManyRelatedManager» нет атрибута «get_active»

Что я пробовал до сих пор: 1) Я прочитал, что use_for_related_fields = True в классе менеджера устарела. Все равно не работает на django v2.1

2) Добавим это в мою модель, так как половина интернета заявляет:

class Project(models.Model):
   ...
   objects = ProjectManager()

   class Meta:
       base_manager_name = 'objects'

3) Попытка избежать RelatedManager и работать с набором запросов:

employee.projects.all().get_active()

Есть идеи, что я делаю не так? И как бы я решил это? Не может быть слишком сложно, верно?

Thx!
Рон

1 Ответ

1 голос
/ 24 июня 2019

Как в состоянии документации , "Менеджеры баз не используются при запросах по связанным моделям".Они приводят пример для движения в другом направлении, то есть project.employee.

. Невозможно сделать это, используя самих менеджеров.Лучше всего определить метод для вашей модели:

class Employee(models.Model):
    ...
    def get_active_projects(self):
        return self.projects.filter(active=True)
        # or
        return Project.objects.filter(employee=self).get_active()
...