django - 如何使用 django rest 框架进行过滤?
问题描述
我在我的项目中使用 django rest 框架,我想对我的产品进行过滤。我过滤具有类别名称和流行的产品。但我也想过滤有折扣的产品。
这是我的模型:
class Product(models.Model):
category = models.ManyToManyField(Category, related_name='products')
name = models.CharField(max_length=500)
slug = models.SlugField(max_length=500, allow_unicode=True, unique=True)
image = models.ImageField(upload_to='products_pic/%Y/%m/%d/', null=True, blank=True)
description = models.TextField(null=True, blank=True)
price = models.PositiveIntegerField()
discount = models.PositiveIntegerField(null=True, blank=True)
available = models.BooleanField(default=True)
popular = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
comments = GenericRelation(Comment)
class Meta:
ordering = ('-created',)
def __str__(self):
return self.name
这里有一个问题。折扣是一个整数字段,我想用布尔折扣过滤产品。我的意思是我想过滤是否有折扣的产品。他们有多少折扣并不重要。
这是我的观点:
class search(generics.ListAPIView):
queryset = Product.objects.filter(available=True)
serializer_class = ProductSerializer
permission_classes = (permissions.AllowAny,)
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filter_fields = ['category__name', 'popular']
search_fields = ['name', 'category__name', 'description']
解决方案
您可以为 DjangoFilterBackend 创建一个过滤器集后端。 文档
过滤器.py
from django_filters import rest_framework
class ProductFilter(rest_framework.FilterSet):
discount= rest_framework.BooleanFilter(method='get_discount')
class Meta:
fields = ("discount", "category__name", "popular")
model = Product
def get_discount(self, queryset, name, value):
return queryset.filter(discount__isnull=False)
之后,您应该将过滤器类设置为视图的属性。
class search(generics.ListAPIView):
queryset = Product.objects.filter(available=True)
serializer_class = ProductSerializer
permission_classes = (permissions.AllowAny,)
filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_class= ProductFilter
search_fields = ['name', 'category__name', 'description']
推荐阅读
- python - 用于分块 NumPy 数组的内置方法
- unity3d - Unity - 触摸屏幕时显示精灵
- java - 如何在二维数组中找到同时在行中较高且在列中较低的数字的索引
- node.js - 我总是对 mern 项目(nodejs 和 reactjs)使用“并发”,但现在我无法同时安装
- python - 警告消息说找不到“.credentials”文件夹,Safari 不会加载“localhost”
- decision-tree - Rapidminer 决策树结果
- haskell - 如何在 Haskell Chart 包中设置图表的背景颜色?
- c++ - 如何在代码块控制台中打印西里尔文文本
- java - java.lang.NoClassDefFoundError: com/google/appengine/api/urlfetch/HTTPMethod
- django - Django搜索中的部分匹配