Django Rest Framework OneToOneField相关的BooleanFilter

时间:2016-10-25 08:51:23

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

我在休息框架中使用django。

现在我有OneToOne关系的模型:

class ModelA(models.Model):
    pass

class ModelB(models.Model):
    a = models.OneToOneField(
        A, related_name='b')

我在A:

上应用了ViewSet
class ModelAViewSet(viewsets.ModelViewSet):
    queryset = ModelA.objects.all()
    serializer_class = ModelASerializer

然后,我想在BooleanFilter上添加ModelAViewSet来过滤ModelA对象是否有相关的ModelB对象。

我尝试了以下内容:

class ModelAViewSet(viewsets.ModelViewSet):
    class Filter(FilterSet):
        has_b = filters.BooleanFilter('b')
    queryset = ModelA.objects.all()
    serializer_class = ModelASerializer
    filter_fields = ['has_b']

所以,如果它有效,我们得到了:

  1. ?has_b=1:返回所有记录而不进行过滤;
  2. ?has_b=2:返回与ModelA对象相关的记录;
  3. ?has_b=3:返回 NO NOT ModelA对象相关的记录;
  4. 除了上面的案例3外,它几乎奏效了。

    那么正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

input

这里有三处变化:

  1. 通过从 <cwaRequests xmlns="http://schemas.microsoft.com/2006/09/rtc/cwa" sid="91"> <queryPresence rid="4"> <uris> <uri>sip:jessicaa@contoso.com</uri> </uris> </queryPresence> </cwaRequests> 子包导入,使用了API友好的from django_filters.rest_framework import FilterSet, filters class Filter(FilterSet): has_b = filters.BooleanFilter(name='b', lookup_expr='isnull', exclude=True) ,因此您可以查询rest_framework而不是BooleanWidget

  2. 过滤器使用?has_b=true查找,允许您测试相关模型的存在。

  3. ?has_b=1正在测试相关isnull缺少,这与您想要的相反。使用b__isnull=True会反转逻辑,以便您改为过滤B代替exclude=True的内容。

  4. 等效的A来电:

    B