编写管理器来过滤查询集结果

Joh*_*ohn 6 python django django-models

我有以下代码:

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()
Run Code Online (Sandbox Code Playgroud)

......它工作正常.唯一的是,我需要更换group='1'group=(the group specified by group = models.ForeignKey(Group)).我有很长时间试图确定是否需要将该外键传递给类,或者传入get_query_set函数,或者是什么.我知道你可以完成这个group.department_set.filter(group=desired group),但是我正在为管理站点编写这个模型,所以我需要在=符号之后使用变量而不是常量.

Mic*_*zyk 4

我有一种预感,以这种方式替换默认设置Manager可能objects不是一个好主意,特别是如果您计划使用管理站点...即使它对您的员工有帮助,但在以下情况下它根本不会帮助您处理部门。与平常一样,提供对部门的有限视图的第二个属性怎么样objects?或者,如果您确实更喜欢应用程序的原始方法,则将标准Managerobjects移至_objects并重命名from_same_group为。objects

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)
Run Code Online (Sandbox Code Playgroud)

另外,我知道您知道如何设置管理站点以利用有趣的优势Manager;如果没有(或者如果我以某种方式误解了你的问题),请发表评论,我会尽快跟进。


编辑:好的,为了更清楚地说明这一点:如果您绝对坚持替换objects,您可能会想要这样做:

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)
Run Code Online (Sandbox Code Playgroud)