Django-filter附加过滤器

2024-09-28 01:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

有以下形式的模型结构

class Industry(models.Model):
    name = models.CharField(max_length=255)

class Category(models.Model):
    name = models.CharField(max_length=255)
    industry = models.ForeignKey('Industry', null=True, blank=True)

class Franchise(models.Model):
    name = models.CharField(max_length=255)
    categories = models.ManyToManyField('Category')
    industries = models.ManyToManyField('Industry')

我有一个常规过滤器:

^{pr2}$

其思想是实现一个过滤器,以便在不选择类别的情况下选择行业时显示所选行业的所有特许经营权(无类别匹配)

我已经实现了额外的过滤器

class CategoryMultipleChoceFilter(django_filters.ModelMultipleChoiceFilter):
    def filter(self, qs, value):
        categories_list = []
        categories_list.extend(value.values_list('id', flat=True))

        if value:
            industries = self.parent.data.getlist('industries')

            for industry_pk in industries:
                industry_instance = Industry.objects.filter(pk=industry, category__in=value)
                if not industry_instance.exists():
                    category = Category.objects.filter(industry=industry_pk)
                    categories_list.extend(category.values_list('id', flat=True))

        return super().filter(qs, categories_list)

对于“类别”字段:

class FranchiseFilterSet(django_filters.FilterSet):
    ...
    categories = CategoryMultipleChoceFilter(
        queryset=Category.objects.all(),
        widget=forms.CheckboxSelectMultiple,
    )

这个解决方案可行,但我不确定它是否正确。或许还有更优雅的解决方案?在


Tags: nametruemodelvaluemodelsfiltermaxlist

热门问题