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

如何用Django-filter实现单字段筛选多外键关联的同模型记录?

解决方案

你可以通过自定义过滤方法结合Django的Q对象,实现单字段筛选同时匹配装货和卸货地点的需求,具体修改如下:

import django_filters
from django import forms
from django.db.models import Q
from .models import DailyPerformance, ConstructionSite

class DailyPerformanceFilter(django_filters.FilterSet):
    date = django_filters.DateFilter(field_name='date', widget=forms.DateInput(attrs={'type': 'date'}))
    start_date = django_filters.DateFilter(field_name='date', lookup_expr='gte')
    end_date = django_filters.DateFilter(field_name='date', lookup_expr='lte')
    # 自定义工地筛选器,指定过滤方法
    construction_site = django_filters.ModelChoiceFilter(
        queryset=ConstructionSite.objects.all(),
        widget=forms.Select(attrs={'class': 'filter-select'}),
        method='filter_construction_site'
    )

    def filter_construction_site(self, queryset, name, value):
        # 使用Q对象实现OR查询:匹配装货地点或卸货地点为选中的工地
        return queryset.filter(
            Q(place_of_loading=value) | Q(place_of_unloading=value)
        )

    class Meta:
        model = DailyPerformance
        # 手动指定需要的筛选字段,排除原有的两个外键筛选器
        fields = ['date', 'start_date', 'end_date', 'driver', 'type_of_goods', 'construction_site', 'number_of_rounds']

关键说明:

  • 移除冗余筛选字段:删掉原FilterSet中的place_of_loading和place_of_unloading字段,不再显示这两个单独的筛选器
  • 自定义过滤逻辑:通过method参数绑定filter_construction_site函数,用Q对象实现“或”条件查询,只要记录的装货或卸货地点是选中的工地,就会被筛选出来
  • 明确指定筛选字段:Meta的fields不再使用__all__,手动列出需要的字段,避免Django自动为原外键字段生成默认筛选器

配置完成后,前端只会显示construction_site这一个工地选择框,选中某个工地时,就能同时获取所有以该工地为装货或卸货地点的DailyPerformance记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:45:58