[英]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
然后,我想添加一個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']
因此,如果可行,我們得到:
?has_b=1
:不過濾就返回所有記錄; ?has_b=2
:返回具有相關ModelA
對象的記錄; ?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)
這里有三個變化:
通過從rest_framework
子包導入,使用了API友好的BooleanWidget
,因此您可以查詢?has_b=true
而不是?has_b=1
。
該過濾器正在使用一個非isnull
查找,這使您可以測試相關模型的存在。
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.