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)
)