在django休息框架中进行过滤 [英] Filtering in django rest framework
问题描述
有我的代码:
models.py
from django.db import models
class Region(models.Model):
name = models.CharField(max_length = 100,blank =真的,null = False)
class Town(models.Model):
region = models.ForeignKey(Region)
name = models.CharField(max_length = 100,blank = True,null = False')
filters.py
import django_filters
from models import Town
class TownFilter(django_filters
region = django_filters.CharFilter(name =region__name,lookup_type =contains)
town = django_filters.CharFilter(name =name,lookup_type =contains)
class Meta:
model = Town
fields = ['region','town']
views.py
$ b从res t_framework import generics
from serializers import TownSerializer
from filters import TownFilter
class TownList(generics.ListAPIView):
queryset = Town.objects.all ()
serializer_class = TownSerializer
filter_class = TownFilter
所以,我可以写?region = Region_name& town = Town_name 到请求url的结尾,结果将被过滤。
但是我想使用请求网址中只能有一个参数,可以将区域或城镇名称作为值。例如?search = Region_name 和?search = Town_name 。如何做到这一点?
有几个选项,但最简单的方法是覆盖你的get_queryset API视图。
示例来自 docs 适用于您的用例:
class TownList(generics.ListAPIView):
queryset = Town.objects.all()
serializer_class = TownSerializer
filter_class = TownFilter(generics.ListAPIView)
serializer_class = PurchaseSerializer
def get_queryset(self):
queryset = Town.objects.all()
search_param = self.request.QUERY_PARAMS.get('search',None)
如果search_param不为None:
设置queryset在这里或使用您的TownFilter
返回查询
另一种方法是在t上设置你的 search_fields
他列出了api视图类组合使用 SearchFilter
类。问题是,如果您要过滤多个模型,您可能需要在此处执行一些额外的实现,以确保它正在查看您想要的内容。如果您没有任何想法,只需为区域设置双重下划线: region__name
In my project I use django rest framework. To filter the results I use django_filters backend. There is my code:
models.py
from django.db import models
class Region(models.Model):
name = models.CharField(max_length=100, blank=True, null=False)
class Town(models.Model):
region = models.ForeignKey(Region)
name = models.CharField(max_length=100, blank=True, null=False')
filters.py
import django_filters
from models import Town
class TownFilter(django_filters.FilterSet):
region = django_filters.CharFilter(name="region__name", lookup_type="contains")
town = django_filters.CharFilter(name="name", lookup_type="contains")
class Meta:
model = Town
fields = ['region', 'town']
views.py
from models import Town
from rest_framework import generics
from serializers import TownSerializer
from filters import TownFilter
class TownList(generics.ListAPIView):
queryset = Town.objects.all()
serializer_class = TownSerializer
filter_class = TownFilter
So, I can write ?region=Region_name&town=Town_name to the end of the request url, and the result will be filtered.
But I want to use only one get param in the request url, which can have region or town name as value. For example ?search=Region_name and ?search=Town_name. How can I do this?
There are a few options, but the easiest way is to just override 'get_queryset' in your API view.
Example from the docs adapted to your use case:
class TownList(generics.ListAPIView):
queryset = Town.objects.all()
serializer_class = TownSerializer
filter_class = TownFilter(generics.ListAPIView)
serializer_class = PurchaseSerializer
def get_queryset(self):
queryset = Town.objects.all()
search_param = self.request.QUERY_PARAMS.get('search', None)
if search_param is not None:
"""
set queryset here or use your TownFilter
"""
return queryset
Another way is to set your search_fields
on the list api view class in combination use the SearchFilter
class. The problem is that if you're filtering over multiple models, you may have to do some additional implementation here to make sure it's looking at exactly what you want. If you're not doing anything fancy, just put double underscores for region for example: region__name
这篇关于在django休息框架中进行过滤的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!