Запись менеджеру для фильтрации результатов набора запроса

У меня есть следующий код:

class GroupDepartmentManager(models.Manager):
  def get_query_set(self):
    return super(GroupDepartmentManager, self).get_query_set().filter(group='1')

class Department(models.Model):
 name = models.CharField(max_length=128)
 group = models.ForeignKey(Group)
 def __str__(self):
    return self.name
 objects = GroupDepartmentManager()

... и это хорошо работает. Только вещь состоит в том, что я должен заменить group='1' с group=(the group specified by group = models.ForeignKey(Group)). У меня есть немало времени, пытаясь определить, должен ли тот внешний ключ быть передан в класс, или в функцию get_query_set, или что. Я знаю, что можно выполнить это с group.department_set.filter(group=desired group), но я пишу эту модель для администраторского сайта, таким образом, я должен использовать переменную и не константу после = знак.

6
задан Vadim Kotov 12 July 2017 в 15:23
поделиться

2 ответа

У меня есть подозрение, что замена стандартного Менеджера на объектов таким образом может быть не очень хорошей идеей, особенно если вы планируете использовать сайт администратора ... Даже если он поможет вам с вашими сотрудниками, он не поможет вам вообще при работе с отделами. Как насчет второго свойства, обеспечивающего ограниченный просмотр отделов наряду с обычными объектами ? Или переместите стандартный Manager из объектов в _objects и переименуйте from_same_group в объектов , если вы действительно предпочитаете исходный подход для вашего приложения.

class Department(models.Model):
    name = models.CharField(max_length=128)
    group = models.ForeignKey(Group)
    def __str__(self):
        return self.name
    objects = models.Manager()

    @property
    def from_same_group(self):
        return Department.objects.filter(group__exact=self.group)

Кроме того, насколько я понимаю, вы знаете, как настроить сайт администратора, чтобы воспользоваться забавным Manager ; если нет (или если я как-то неправильно понял ваш вопрос), оставьте комментарий, я постараюсь ответить как-нибудь в ближайшее время.


РЕДАКТИРОВАТЬ: Хорошо, чтобы прояснить это: если вы абсолютно настаиваете на замене объектов , вы, вероятно, захотите для этого:

class Department(models.Model):
    name = models.CharField(max_length=128)
    group = models.ForeignKey(Group)
    def __str__(self):
        return self.name

    _objects = models.Manager()

    @property
    def objects(self):
        # note the _objects in the next line
        return Department._objects.filter(group__exact=self.group)
4
ответ дан 17 December 2019 в 02:29
поделиться

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

Однако я думаю, что эта статья о фильтрации объектов модели с помощью настраиваемого менеджера укажет вам правильное направление. Автор предлагает метод выполнения вызова функции, который возвращает настроенный класс менеджера, параметры фильтра которого сохранены в классе, чтобы они не передавались экземпляру. Сделай это!

2
ответ дан 17 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: