У меня есть следующий код:
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)
, но я пишу эту модель для администраторского сайта, таким образом, я должен использовать переменную и не константу после = знак.
У меня есть подозрение, что замена стандартного Менеджера
на объектов
таким образом может быть не очень хорошей идеей, особенно если вы планируете использовать сайт администратора ... Даже если он поможет вам с вашими сотрудниками, он не поможет вам вообще при работе с отделами. Как насчет второго свойства, обеспечивающего ограниченный просмотр отделов наряду с обычными объектами
? Или переместите стандартный 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)
Возможно, вы захотите пересмотреть отношения между группами и отделами, если обнаружите, что попытка создать настраиваемого менеджера слишком сложна. Менеджеры преуспевают в упрощении общих запросов, но не умеют отображать сложные отношения между моделями и экземплярами моделей.
Однако я думаю, что эта статья о фильтрации объектов модели с помощью настраиваемого менеджера укажет вам правильное направление. Автор предлагает метод выполнения вызова функции, который возвращает настроенный класс менеджера, параметры фильтра которого сохранены в классе, чтобы они не передавались экземпляру. Сделай это!