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

django-filter常见问题:如何从关联模型中获取choices选项值?

问题解答

该需求完全可以实现,你现有代码的问题是过滤器类型选择错误,以下是具体修正方案:

问题原因

  • 你当前使用的ModelChoiceFilter是用于选择关联模型的实例对象,而非读取模型字段的choices枚举选项
  • 你需要使用ChoiceFilter类型,该类型专门适配带有choices配置的字段过滤场景

修正代码

过滤器配置修改

import django_filters
from .models import Container, Period

class ContainerFilter(django_filters.FilterSet):
    # 改用ChoiceFilter,直接指定关联模型的枚举配置即可
    type_of_period = django_filters.ChoiceFilter(
        choices=Period.PeriodType.choices,
        field_name='period__type',
        lookup_expr='exact',
        label='周期类型'
    )

    class Meta:
        model = Container
        fields = ['type_of_period',]

如果需要支持同时选择多个周期类型过滤,可以使用多选版本的过滤器:

type_of_period = django_filters.MultipleChoiceFilter(
    choices=Period.PeriodType.choices,
    field_name='period__type',
    lookup_expr='in',
    label='周期类型(多选)'
)

视图集可选优化

如果你使用的是较新版本的django-filter和Django REST Framework,建议将视图集中的filter_class = ContainerFilter替换为filterset_class = ContainerFilter,避免出现弃用警告:

class ContainerModelViewSet(viewsets.ModelViewSet):
    queryset = models.Container.objects.all()
    lookup_field = 'id'
    filter_backends = [filters.SearchFilter, django_filters.rest_framework.DjangoFilterBackend]
    search_fields = ['description',]
    # 替换为filterset_class
    filterset_class = ContainerFilter

效果说明

配置完成后过滤器会自动加载你在PeriodType中定义的枚举选项,前端展示的是友好的文本Long period/Short period,过滤时自动匹配对应的数据库存储值long/short,可以正确筛选出关联了对应类型Period的Container实例。


内容的提问来源于stack exchange,提问作者Tomas Jacobsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 01:45:03