从模型管理器中的Django Queryset获取过滤器kwargs

时间:2017-01-14 08:58:48

标签: django django-models django-queryset

我有一个Company模型隐藏了一些status。因此,当用户查询Company.objects.all()时,我会过滤掉任何我认为不合适的特殊status。 像下面的东西

class Company(models.Model):
   name=models.TextField()
   status=models.CharField()
   ...
   objects = FilteredCompanyManager()

其中

class FilteredCompanyManager(models.Manager):
    def get_queryset(self):
        return super(FilteredCompanyManager, self).get_queryset().exclude(status__in=CompanyConstants.SPECIAL_STATUS.values())

我的问题是,我希望Company.objects.filter(displayAllObjects=True)之类的内容不排除任何状态。所以我修改过的虚构FilteredCompanyManager看起来像

class FilteredCompanyManager(models.Manager):
    def get_queryset(self):
        if 'displayAllObjects' in super(FilteredCompanyManager, self).get_queryset().get_kwargs():
            return  super(FilteredCompanyManager, self).get_queryset()
        else:
            return super(FilteredCompanyManager, self).get_queryset().exclude(status__in=CompanyConstants.SPECIAL_STATUS.values())

我知道我可以用objects=FilteredCompanyManagerallObjects=models.Manager()来做这件事,但想要一种可以在单个模型管理器中使用而不是两个模型管理器的方法。

1 个答案:

答案 0 :(得分:0)

您应该制作一个管理员方法,您可以在其中发送displayAllObjects kwargs:

class FilteredCompanyManager(models.Manager):

     def get_filtered_objs(self, *args, **kwargs):
        if kwargs.pop('displayAllObjects', False):
             return self.get_queryset().all()
        else:
             return self.get_queryset().exclude(status__in=CompanyConstants.SPECIAL_STATUS.values())

现在您可以按如下方式使用它:

Company.objects.get_filtered_objs(displayAllObjects=True)

或者

Company.objects.get_filtered_objs()