在django休息框架中进行过滤 [英] Filtering in django rest framework

查看:295
本文介绍了在django休息框架中进行过滤的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的项目中,我使用django休息框架。要过滤结果,我使用django_filters后端。
有我的代码:



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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆