Django_filters применяет все выбранные поля фильтра

Hej! :)

Я хочу отфильтровать данные перед тем, как произвести с ними некоторые вычисления с помощью оператора 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)
        )

Есть ли у кого-нибудь идея, что идет не так? У меня есть похожий фильтр для чего-то другого, и он работает нормально. Кажется, я упустил что-то важное.

Любая помощь будет принята с благодарностью! Спасибо за время :)

Я думаю, что вам нужно использовать queryset в методе year_filter вашего фильтра. В настоящее время вы создаете новый набор запросов с нуля, если применяется фильтр по году. Замените 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)
        )
Вернуться на верх