Django REST框架:如何组合两个查询集?

时间:2017-01-19 13:40:50

标签: python django django-rest-framework django-queryset django-filter

我正在尝试将两个过滤器组合在一起,这些过滤器在一个对象中被称为FK,但我得到了错误的冗余数据。

下面是过滤器,位于views.py:

class RecordFilter(df.FilterSet):
    user = df.CharFilter(name='active_states__user', method='filter_user')
    activestate = df.BooleanFilter(name='active_states__is_active', method='filter_is_active')

    class Meta:
        model = Record
        fields = ['type', 'group', 'user', 'activestate']

    def filter_user(self, queryset, _, value):
        return queryset.filter(active_states__user_id=value)

    def filter_is_active(self, queryset, _, value):
        return queryset.filter(active_states__is_active=value)

例如,在我的测试用例中,我创建了4个记录对象,并向他们添加了activestate和user。

record1.set_active_states_for_users([user1.uuid], True)
record2.set_active_states_for_users([user1.uuid], False)
record2.set_active_states_for_users([user2.uuid], True)
record3.set_active_states_for_users([user2.uuid], False)

我尝试为user = user2和activestate = True测试这些过滤器。 而且我得到了:

  • record2的两倍,因为activestate = True而user = user2
  • 由于user = user2
  • ,有一次记录3

结果应该只是record2。

我注意到chain可以进行查询集的连接,但我不知道如何在RecordFilter类的views.py中使用它。你有什么线索吗?

1 个答案:

答案 0 :(得分:2)

您的情况描述为here。可以实现此API:

class RecordFilter(df.FilterSet):
    active_user = df.CharFilter(method='filter_active_user')
    disabled_user = df.CharFilter(method='filter_disabled_user')

    class Meta:
        model = Record
        fields = ['type', 'group', 'user']

def filter_active_user(self, queryset, name, value):
    return queryset.filter(active_states__is_active=True,
                           active_states__user_id=value)

def filter_disabled_user(self, queryset, name, value):
    return queryset.filter(active_states__is_active=False,
                           active_states__user_id=value)

因此,您可以过滤任何,仅禁用和仅启用的用户。 查询active_user = user2将只返回record2。

但我不知道您为何使用CharFilter user来过滤查询集active_states__user_id=value。如果id不是字符串,则看起来像是错误。