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

时间:2009-12-23 18:55:47

标签: 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()

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

2 个答案:

答案 0 :(得分: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)

此外,我了解您知道如何设置管理网站以利用有趣的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)

答案 1 :(得分:2)

如果您发现尝试创建自定义管理器过于复杂,则可能需要重新考虑组和部门之间的关系。管理人员擅长简化常见查询,但却在模型和模型实例之间展示复杂的关系。

但是,我认为这篇关于filtering model objects with a custom manager的文章会指出正确的方向。作者提出了一种执行函数调用的技术,该函数调用返回一个自定义管理器类,该类具有您在类中保存的指定过滤器参数,因此它们不会传递给实例。做吧!

相关问题