首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >DRF模糊查询

DRF模糊查询

原创
作者头像
对你的承诺
发布于 2025-07-27 22:36:46
发布于 2025-07-27 22:36:46
2980
举报

实现使用category查询和name字段的模糊查询

代码语言:python
复制
#models.py
from django.db import models

# Create your models here.

# 定义一个菜品种类
class Category(models.Model):
    name = models.CharField(max_length=10,verbose_name='菜品种类')
    def __str__(self):
        return self.name

# 定义一个菜品
class Dish(models.Model):
    name = models.CharField(max_length=32,verbose_name='菜品名称')
    price = models.DecimalField(max_digits=5,decimal_places=2,verbose_name='菜品价格')
    category = models.ForeignKey(Category,on_delete=models.CASCADE,verbose_name='菜品所属类别')
    picture = models.ImageField(upload_to='dish_pictures',verbose_name='菜品图片')
    def __str__(self):
        return self.name
代码语言:python
复制
# view.py
from rest_framework.permissions import IsAuthenticated
from rest_framework.viewsets import ReadOnlyModelViewSet
from django_filters.rest_framework import DjangoFilterBackend
from .models import Category, Dish
from .Serializer import CategorySerializer, DishSerializer
from .filters import DishModelFilter
# Create your views here.
# 返回类别
class CategoryView(ReadOnlyModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = [IsAuthenticated]


class DishView(ReadOnlyModelViewSet):
    queryset = Dish.objects.all()
    serializer_class = DishSerializer
    filterset_fields = ['category']
    filter_backends = [DjangoFilterBackend]
    filterset_class = DishModelFilter
    permission_classes = [IsAuthenticated]
代码语言:python
复制
# filters.py
import django_filters
from .models import Dish
 
class DishModelFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(method='filter_name')
    category = django_filters.CharFilter(method='filter_category')
 
    def filter_name(self, queryset, name, value):
        return queryset.filter(name__icontains=value)
    
    def filter_category(self, queryset, name, value):
        return queryset.filter(category_id=value)
    
 
    class Meta:
        model = Dish
        fields = ['name','category']

queryset是model(Dish)的查询集

name是查询的字段

value是查询的内容

需要说明外键字段不支持模糊查询否则报错

Unsupported lookup 'icontains' for ForeignKey or join on the field not permitted

或

Unsupported lookup 'icontains' for ForeignKey or join on the field not permitted

或

The QuerySet value for an exact lookup must be limited to one result using slicing.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档