Django Rest Framework 过滤计算模型属性

django

1个回答

写回答

18017312639

2025-08-26 13:25

+ 关注

Django
Django

Django Rest Framework 过滤计算模型属性

Django Rest Framework(简称DRF)是一个强大的工具,用于构建Web API。它提供了许多功能,包括序列化、身份验证、过滤、分页等,使开发人员能够轻松地构建高效的API。在DRF中,过滤是一个重要的功能,它允许我们根据特定的条件来筛选查询结果。然而,有时我们需要对模型属性进行计算,并根据计算结果进行过滤。本文将介绍如何在DRF中实现这一功能,并提供一个案例代码。

案例代码:

假设我们有一个模型,表示商品的价格和折扣信息:

Python

from Django.db import models

class Product(models.Model):

name = models.CharField(max_length=100)

price = models.DecimalField(max_digits=6, decimal_places=2)

discount = models.DecimalField(max_digits=3, decimal_places=2)

@property

def discounted_price(self):

return self.price * (1 - self.discount)

上述模型中,discounted_price是一个只读属性,用于计算商品的折扣后价格。

接下来,我们将使用DRF来实现对商品价格的过滤。首先,我们需要定义一个过滤器类,用于处理价格过滤:

Python

from Django_filters import rest_framework as filters

class ProductFilter(filters.FilterSet):

min_price = filters.NumberFilter(field_name='discounted_price', lookup_expr='gte')

max_price = filters.NumberFilter(field_name='discounted_price', lookup_expr='lte')

class Meta:

model = Product

fields = ['min_price', 'max_price']

在上述代码中,ProductFilter继承自DRF的FilterSet类,并定义了min_pricemax_price两个过滤器,它们分别对应商品的最低价格和最高价格。field_name参数指定了要过滤的字段,这里我们使用了discounted_price来进行计算后的价格过滤。lookup_expr参数指定了过滤的条件,这里我们使用了gte(大于等于)和lte(小于等于)。

接下来,我们需要在视图中使用上述过滤器类。假设我们有一个商品列表视图:

Python

from rest_framework import generics

class ProductList(generics.ListAPIView):

queryset = Product.objects.all()

serializer_class = ProductSerializer

filterset_class = ProductFilter

在上述代码中,我们将ProductFilter指定给filterset_class属性,以启用过滤功能。现在,我们可以通过以下方式来过滤商品列表:

- GET /products?min_price=10:获取价格大于等于10的商品列表。

- GET /products?max_price=50:获取价格小于等于50的商品列表。

- GET /products?min_price=10&max_price=50:获取价格介于10到50之间的商品列表。

通过上述案例代码,我们可以看到如何使用DRF来过滤计算模型属性。通过定义过滤器类,并在视图中使用它,我们可以轻松地实现对模型属性的过滤。这为我们构建灵活且高效的API提供了便利,使我们能够根据特定的条件来筛选查询结果。

参考代码

Python

from Django.db import models

from Django_filters import rest_framework as filters

from rest_framework import generics

class Product(models.Model):

name = models.CharField(max_length=100)

price = models.DecimalField(max_digits=6, decimal_places=2)

discount = models.DecimalField(max_digits=3, decimal_places=2)

@property

def discounted_price(self):

return self.price * (1 - self.discount)

class ProductFilter(filters.FilterSet):

min_price = filters.NumberFilter(field_name='discounted_price', lookup_expr='gte')

max_price = filters.NumberFilter(field_name='discounted_price', lookup_expr='lte')

class Meta:

model = Product

fields = ['min_price', 'max_price']

class ProductList(generics.ListAPIView):

queryset = Product.objects.all()

serializer_class = ProductSerializer

filterset_class = ProductFilter

以上就是关于在Django Rest Framework中过滤计算模型属性的介绍和示例代码。希望本文对您有所帮助!

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号