我如何在 Django 休息框架中的查询参数中制作 OR 运算符
How can i make OR operator in query params in django rest framework
如果我需要在 django rest 中进行过滤,那么我通常会这样做
class ProductFilter(django_filters.FilterSet):
min_price = django_filters.NumberFilter(name="price", lookup_type='gte')
max_price = django_filters.NumberFilter(name="price", lookup_type='lte')
class Meta:
model = Product
fields = ['category', 'in_stock', 'min_price', 'max_price']
class ProductList(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_class = ProductFilter
我可以像这样使用
http://example.com/api/products?category=clothing&max_price=10.00
但是这样就可以了 AND
我该怎么做或者从 url 喜欢
其中 (category = clothing || max_price = 10)
基本上我应该能够提供 URL 中的所有参数,例如
http://example.com/api/products? AND=[{category: clothing}, {age: 10}], OR=[{age_gte:10}]
好的,您需要传入 url 一些标志来检查您是否要执行混合查询。还要给params加上前缀,如果AND运算符中要用age=20
,就加上前缀'and_',看起来像and_age=20
等等。 OR 参数也一样。
让我们有这个url
http://example.com/api/products?and_category=clothing&and_max_price=10.00&or_age=20&mixed=true
现在,我们的观点。
class ProductList(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_class = ProductFilter
def get_queryset(self):
data = self.request.DATA
mixed_query = data.get('mixed',None)
if not mixed_query:
return self.queryset
and_params = {}
for key in data:
if 'and_' in key:
and_params[key] = data[key]
queryset = Products.objects.filter(**and_params)
for key in self.request.DATA:
if 'or_' in key:
queryset = queryset | Products.objects.filter(key=data[key])
return queryset
注意:自版本 3.0
以来,request.DATA
已被弃用,取而代之的是 request.data
如果我需要在 django rest 中进行过滤,那么我通常会这样做
class ProductFilter(django_filters.FilterSet):
min_price = django_filters.NumberFilter(name="price", lookup_type='gte')
max_price = django_filters.NumberFilter(name="price", lookup_type='lte')
class Meta:
model = Product
fields = ['category', 'in_stock', 'min_price', 'max_price']
class ProductList(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_class = ProductFilter
我可以像这样使用
http://example.com/api/products?category=clothing&max_price=10.00
但是这样就可以了 AND
我该怎么做或者从 url 喜欢
其中 (category = clothing || max_price = 10)
基本上我应该能够提供 URL 中的所有参数,例如
http://example.com/api/products? AND=[{category: clothing}, {age: 10}], OR=[{age_gte:10}]
好的,您需要传入 url 一些标志来检查您是否要执行混合查询。还要给params加上前缀,如果AND运算符中要用age=20
,就加上前缀'and_',看起来像and_age=20
等等。 OR 参数也一样。
让我们有这个url
http://example.com/api/products?and_category=clothing&and_max_price=10.00&or_age=20&mixed=true
现在,我们的观点。
class ProductList(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_class = ProductFilter
def get_queryset(self):
data = self.request.DATA
mixed_query = data.get('mixed',None)
if not mixed_query:
return self.queryset
and_params = {}
for key in data:
if 'and_' in key:
and_params[key] = data[key]
queryset = Products.objects.filter(**and_params)
for key in self.request.DATA:
if 'or_' in key:
queryset = queryset | Products.objects.filter(key=data[key])
return queryset
注意:自版本 3.0
以来,request.DATA
已被弃用,取而代之的是 request.data