You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:50:38