我的模型有 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__'
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__'