实现使用category查询和name字段的模糊查询
#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
# 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]
# 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 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。