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
相关产品推荐
相关产品推荐

