django-filter的基本使用

django-filter 查询

创建model和视图

from django.db import models


# Create your models here.

class Student(models.Model):
    SEX_CHOICES = (
        (0, '女'),
        (1, '男')
    )
    name = models.CharField(max_length=10)
    sex = models.SmallIntegerField(choices=SEX_CHOICES)
    courses = models.ManyToManyField('Course')
    teacher = models.ForeignKey('Teacher', on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.name


class Teacher(models.Model):
    name = models.CharField(max_length=10)

    def __str__(self):
        return self.name


class Course(models.Model):
    name = models.CharField(max_length=10)

    def __str__(self):
        return self.name
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.viewsets import ModelViewSet
from . import serializer
from . import models
from . import filter


class StudentView(ModelViewSet):
    queryset = models.Student.objects.all()
    serializer_class = serializer.StudentSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_class = filter.StudentFilter
from django_filters.rest_framework import FilterSet
import django_filters
from . import models


class StudentFilter(FilterSet):
    # 原始查询 + lookup_expr查询表达式
    name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
    # choice查询
    sex = django_filters.ChoiceFilter(choices=models.Student.SEX_CHOICES)
    # 自定义choice value查询
    sex_display = django_filters.CharFilter(method='get_sex_display')

    # 跨表查询
    teacher = django_filters.CharFilter(field_name='teacher__name')

    class Meta:
        model = models.Student
        fields = '__all__'

    def get_sex_display(self, queryset, name, value):
        # print(self.qs)
        item = {i[1]: i[0] for i in models.Student.SEX_CHOICES}
        sex_value = item.get(value, None)
        if sex_value is not None:
            condition = {'sex': sex_value}
            return queryset.filter(**condition)
        return queryset

猜你喜欢

转载自www.cnblogs.com/ivy-blogs/p/11932815.html