首页 > 解决方案 > 如何使用 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']

标签: djangodjango-rest-framework

解决方案


您可以为 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']

推荐阅读