Python 使用django过滤器将多个过滤器组合成一个过滤器()

Python 使用django过滤器将多个过滤器组合成一个过滤器(),python,django,django-filter,Python,Django,Django Filter,我正在使用应用程序。然而,有一个问题我不知道如何解决。这与django文档中描述的内容几乎完全相同: 我想做一个查询,选择在标题中同时包含和条目的所有博客,例如: Blog.objects.filter(entry__headline__contains='Lennon', entry__pub_date__year=2008) 不要选择标题为“列侬”的博客和2008年发布的其他博客(可能相同): Blog.objects.filter(entry__headline__conta

我正在使用应用程序。然而,有一个问题我不知道如何解决。这与django文档中描述的内容几乎完全相同:

我想做一个查询,选择在标题中同时包含条目的所有博客,例如:

Blog.objects.filter(entry__headline__contains='Lennon', 
    entry__pub_date__year=2008)
不要选择标题为“列侬”的博客和2008年发布的其他博客(可能相同):

Blog.objects.filter(entry__headline__contains='Lennon').filter(
    entry__pub_date__year=2008)
但是,如果我设置过滤器,使其有两个字段(nevermind\uuuu包含x\uuuuu,仅举一个例子):

django过滤器将生成后者:

Blog.objects.filter(entry__headline__exact='Lennon').filter(
    entry__pub_date__exact=2008)

有没有办法将两个过滤器组合成一个过滤器字段?

嗯,我有一个解决方案。使用常规的django过滤器是不可能的,所以我对它进行了一些扩展。本可以改进的,这是一个快速的解决方案

首先在django_filters.Filter和Filter_grouped方法(几乎是Filter方法的副本)中添加了一个自定义“分组”字段

唯一的区别是,它不是在查询集上创建过滤器,而是返回一个字典

第二次更新BaseFilterSet qs方法/属性:

class BaseFilterSet(object):
    (...)
    @property
    def qs(self):
        if not hasattr(self, '_qs'):
            qs = self.queryset.all()
            grouped_dict = {}
            for name, filter_ in self.filters.iteritems():
                try:
                    if self.is_bound:
                        data = self.form[name].data
                    else:
                        data = self.form.initial.get(name, self.form[name].field.initial)
                    val = self.form.fields[name].clean(data)
                    if filter_.grouped:
                        grouped_dict.update(filter_.filter_grouped(qs, val))
                    else:
                        qs = filter_.filter(qs, val)
                except forms.ValidationError:
                    pass

            if grouped_dict:
                qs = qs.filter(**grouped_dict)

        (...)
    return self._qs
诀窍是将所有“分组”过滤器存储在字典中,然后将它们全部用作单个过滤器

过滤器将如下所示:

class BlogFilter(django_filters.FilterSet):
    entry__headline = django_filters.CharFilter(grouped=True)
    entry__pub_date = django_filters.CharFilter(grouped=True)

    class Meta:
        model = Blog
        fields = ['entry__headline', 'entry__pub_date', ]

很抱歉恢复了这个旧线程,但是
Foo.objects.filter(Foo=“bar”).filter(qux=“qux”)
实际上与
Foo.objects.filter(Foo=“bar”,qux=“qux”)
多个关键字参数和后续过滤器是“和”组合在一起的。要创建“或”过滤器,您必须使用
Q
objects:@cvk hi,根据(dev和1.2版本),使用两个链式过滤器会产生“选择所有博客,其中包含标题中带有“列侬”的条目以及2008年发布的条目”,但如果使用带有逗号的单个条目,则会产生“选择所有包含标题中同时包含“列侬”和2008年发布的条目的博客(同一条目同时满足这两个条件)”。这是一个巨大的差异。我还没有找到使用django筛选器实现这一点的方法
class BaseFilterSet(object):
    (...)
    @property
    def qs(self):
        if not hasattr(self, '_qs'):
            qs = self.queryset.all()
            grouped_dict = {}
            for name, filter_ in self.filters.iteritems():
                try:
                    if self.is_bound:
                        data = self.form[name].data
                    else:
                        data = self.form.initial.get(name, self.form[name].field.initial)
                    val = self.form.fields[name].clean(data)
                    if filter_.grouped:
                        grouped_dict.update(filter_.filter_grouped(qs, val))
                    else:
                        qs = filter_.filter(qs, val)
                except forms.ValidationError:
                    pass

            if grouped_dict:
                qs = qs.filter(**grouped_dict)

        (...)
    return self._qs
class BlogFilter(django_filters.FilterSet):
    entry__headline = django_filters.CharFilter(grouped=True)
    entry__pub_date = django_filters.CharFilter(grouped=True)

    class Meta:
        model = Blog
        fields = ['entry__headline', 'entry__pub_date', ]