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)
)
嘿! :)
我想在使用 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)
)