簡體   English   中英

Django Rest Framework OneToOneField相關的BooleanFilter

[英]Django Rest Framework OneToOneField related BooleanFilter

我正在使用帶有其余框架的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

然后,我想添加一個BooleanFilterModelAViewSet過濾是否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 :返回沒有相關ModelA對象的記錄;

除了上面的情況3之外,它幾乎奏效了。

那么正確的方法是什么?

from django_filters.rest_framework import FilterSet, filters

class Filter(FilterSet):
    has_b = filters.BooleanFilter(name='b', lookup_expr='isnull', exclude=True)

這里有三個變化:

  1. 通過從rest_framework子包導入,使用了API友好的BooleanWidget ,因此您可以查詢?has_b=true而不是?has_b=1

  2. 該過濾器正在使用一個非isnull查找,這使您可以測試相關模型的存在。

  3. b__isnull=True正在測試是否缺少相關的B ,這與您想要的相反。 使用exclude=True顛倒邏輯,以便您改為過濾具有相關B A

等效的.filter()調用:

# before, incorrect
A.objects.filter(b=True)

# after, correct
A.objects.exclude(b__isnull=True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM