Django_filters 应用所有选择的过滤字段

Django_filters apply all chosen filter fields

嘿! :)

我想在使用 AND 运算符对数据进行一些计算之前过滤我的数据。应应用所选的筛选字段。我将模式的一些字段添加到过滤器函数中,我可以过滤(例如)名称和年份。但没有合并。如果我尝试同时过滤名称和年份,我只会得到年份的结果。

在我的模型中,我得到了一个 M2M 到另一个模型,其中设置了年份:

# models.py

class Plant(models.Model):
    name = models.CharField(
        max_length=200
    )
    used_xducts = models.ManyToManyField(
        Xduct,
        through="UsedXduct",
        blank=True,
        related_name="used_in_plant"
    )


class UsedXduct(models.Model):
    plant = models.ForeignKey(
        Plant,
        on_delete=models.PROTECT,
        related_name="used_in_plant"
    )
    xduct = models.ForeignKey(
        Xduct,
        on_delete=models.PROTECT,
        related_name="xduct"
    )
    year = models.SmallIntegerField(
        validators=[validate_year],
        blank=True,
        null=True
    )


class Xduct(models.Model):
    code = models.CharField(
        max_length = 20,
        blank = True,
        null = True,
        unique = True
    )
    name_english = models.CharField(
        max_length = 200,
        blank = True,
        null = True,
        unique = True
    )
    description_english = models.TextField(
        max_length = 500,
        blank = True
    )
    explanation_english = models.TextField(
        max_length = 4000,
        blank = True
    )
# filters.py

class PlantsNameFilter(django_filters.FilterSet):
    name = ModelChoiceFilter(queryset=Plant.objects.all())
    year = django_filters.NumberFilter(method='year_filter', label='Year')

    class Meta:
        model = Plant
        fields =["name", "year"]

    def year_filter(self, queryset, name, value):
        return Plant.objects.filter(
            Q(used_in_plant__year=value)
        )

有人知道出了什么问题吗? 我有一个类似的过滤器用于其他东西,它工作正常。我好像漏掉了什么重要的东西。

感谢任何帮助! 感谢抽出时间:)

我认为您需要在过滤器的方法 year_filter 中使用 queryset。目前,如果应用了年份过滤器,您可以从头开始创建一个新的查询集。将 Plant.objects 替换为 queryset,如下所示:

class PlantsNameFilter(django_filters.FilterSet):
    name = ModelChoiceFilter(queryset=Plant.objects.all())
    year = django_filters.NumberFilter(method='year_filter', label='Year')

    class Meta:
        model = Plant
        fields =["name", "year"]

    def year_filter(self, queryset, name, value):
        return queryset.filter( # <---- HERE
            Q(used_in_plant__year=value)
        )