Django-从一个模型中过滤多个外键

问题描述 投票:0回答:1

我的模型有 2 个字段 place_of_loading 和 place_of_unloading ,外键指向同一模型 ConstructionSite。

class DailyPerformance(models.Model):
  date = models.DateField()
  driver = models.ForeignKey(Employee, on_delete=models.CASCADE)
  TYPE_OF_GOODS_CHOICES = (
    ("Excavated soil", "Excavated soil"),
    ("Sand", "Sand"),
    ("Crushed stone", "Crushed stone"),...
  )
  type_of_goods = models.CharField(blank=True, null=True, max_length=30, choices=TYPE_OF_GOODS_CHOICES)
  place_of_loading = models.ForeignKey(ConstructionSite, on_delete=models.CASCADE, related_name='place_of_loading')
  place_of_unloading = models.ForeignKey(ConstructionSite, on_delete=models.CASCADE, related_name='place_of_unloading') 
  number_of_rounds = models.IntegerField(blank=True, null=True)

现在我想使用 django-filters 实现过滤器,但我希望不是 2 个字段 place_of_loading 和 place_of_unloading 而是有 1 个字段 Construction_site 并显示这两个字段的结果。 因此,如果我选择一个建筑工地,我想获得有关装卸材料的所有信息。

class DailyPerformanceFilter(django_filters.FilterSet):
    date = DateFilter(field_name='date', widget=DateInput(attrs={'type': 'date'}))
    start_date = DateFilter(field_name='date', lookup_expr='gte')
    end_date = DateFilter(field_name='date', lookup_expr='lte')
    place_of_loading = django_filters.ModelChoiceFilter(queryset = ConstructionSite.objects.all(), widget=forms.Select(attrs={'class': 'filter-select'}))
    place_of_unloading = django_filters.ModelChoiceFilter(queryset = ConstructionSite.objects.all(), widget=forms.Select(attrs={'class': 'filter-select'}))
    construction_site = django_filters.ModelChoiceFilter(queryset = ConstructionSite.objects.all(), widget=forms.Select(attrs={'class': 'filter-select'}))
    class Meta:
        model = DailyPerformance
        fields = '__all__'
django django-models django-forms django-filter
1个回答
0
投票

我们可以使用

method=
参数[readthedocs.io] 自定义过滤并查找这两个字段:

from django.db.models import Q


class DailyPerformanceFilter(django_filters.FilterSet):
    date = DateFilter(field_name='date', widget=DateInput(attrs={'type': 'date'}))
    start_date = DateFilter(field_name='date', lookup_expr='gte')
    end_date = DateFilter(field_name='date', lookup_expr='lte')
    place_of_loading = django_filters.ModelChoiceFilter(
        queryset=ConstructionSite.objects.all(),
        widget=forms.Select(attrs={'class': 'filter-select'}),
    )
    place_of_unloading = django_filters.ModelChoiceFilter(
        queryset=ConstructionSite.objects.all(),
        widget=forms.Select(attrs={'class': 'filter-select'}),
    )
    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):
        return queryset.filter(
            Q(place_of_loading=value) | Q(place_of_unloading=value)
        )

    class Meta:
        model = DailyPerformance
        fields = '__all__'
© www.soinside.com 2019 - 2024. All rights reserved.