DRF中如何在父视图筛选子类Cart的日期字段?
基于关联Cart日期字段筛选Customer列表的实现方案
1. 先确认模型关联(确保外键关系正确)
假设你的模型定义如下,Cart通过外键关联Customer:
# models.py from django.db import models class Base(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: abstract = True class Customer(Base): name = models.CharField(max_length=100) # 其他业务字段... class Cart(Base): customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name='carts') # 其他业务字段...
2. 修改filters.py中的CustomerListFilter
利用Django Filter的双下划线(__)实现跨关联表筛选,直接指定Cart的日期字段作为筛选条件:
# filters.py import django_filters from .models import Customer class CustomerListFilter(django_filters.FilterSet): # 按Cart的创建日期范围筛选 cart_created_after = django_filters.DateTimeFilter(field_name='carts__created_at', lookup_expr='gte') cart_created_before = django_filters.DateTimeFilter(field_name='carts__created_at', lookup_expr='lte') # 按Cart的更新日期范围筛选 cart_updated_after = django_filters.DateTimeFilter(field_name='carts__updated_at', lookup_expr='gte') cart_updated_before = django_filters.DateTimeFilter(field_name='carts__updated_at', lookup_expr='lte') class Meta: model = Customer fields = ['cart_created_after', 'cart_created_before', 'cart_updated_after', 'cart_updated_before']
注:如果Cart模型的外键没有设置
related_name='carts',默认关联名为cart_set,此时字段名要写成cart_set__created_at
3. 在DRF视图中应用过滤器
在Customer的列表视图里指定过滤器类:
# views.py from rest_framework import viewsets from .models import Customer from .filters import CustomerListFilter from .serializers import CustomerSerializer class CustomerViewSet(viewsets.ModelViewSet): queryset = Customer.objects.all() serializer_class = CustomerSerializer filterset_class = CustomerListFilter # Django Filter新版本推荐用这个,旧版可用filter_class
4. 测试筛选请求
通过URL参数即可发起筛选,示例:
- 获取所有关联Cart在2024-01-01之后创建的客户:
/api/customers/?cart_created_after=2024-01-01T00:00:00 - 获取所有关联Cart在2024-01-01至2024-01-31之间更新的客户:
/api/customers/?cart_updated_after=2024-01-01T00:00:00&cart_updated_before=2024-01-31T23:59:59
内容的提问来源于stack exchange,提问作者Xursandbek Ibadullayev
相关产品推荐
相关产品推荐

