使用过滤器与模型继承

3 投票
1 回答
2192 浏览
提问于 2025-05-01 00:06

我之前成功地使用过Django的过滤器来过滤模型,像这样:

class ProductFilter(django_filters.FilterSet):
    minCost = django_filters.NumberFilter(name="cost", lookup_type='gte')
    maxCost = django_filters.NumberFilter(name="cost", lookup_type='lte')
    class Meta:
        model = Product
        fields = ['name', 'minPrice', 'maxPrice', 'manufacturer',]

现在我想用Django的过滤器来过滤很多不同的模型,这些模型都是从一个基础模型继承而来的,比如(我的模型并没有这么简单,但这样可以说明问题):

class BaseProduct(models.Model):
    name = models.CharField(max_length=256)
    cost = models.DecimalField(max_digits=10,decimal_places=2)

class FoodProduct(BaseProduct):
    farmer = models.CharField(max_length=256)

class ClothingProduct(BaseProduct):
    size = models.CharField(max_length=256)

有没有办法使用一个Django过滤器,能够适用于所有从BaseProduct继承的模型?在我的情况下,会有很多模型,而且有些模型的变量也很多。

暂无标签

1 个回答

2

把内容添加到你的 BaseProduct

 class Meta:
    abstract = True

https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes

基础模型不会用来创建任何数据库表。相反,当它作为其他模型的基类时,它的字段会被添加到子类中。

https://django-filter.readthedocs.org/en/latest/usage.html#the-filter

就像使用 ModelForm 一样,我们也可以重写过滤器,或者使用声明式语法添加新的过滤器。

class BaseProductFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_type='icontains')
    cost = django_filters.NumberFilter(lookup_type='lt')


class FoodProductFilter(BaseProductFilter):
    farmer = django_filters.CharFilter(lookup_type='icontains')

    class Meta:
        model = FoodProduct
        fields = ['name', 'cost', 'farmer']


class ClothingProductFilter(BaseProductFilter):
    # size lookup_type will be 'exact'
    class Meta:
        model = ClothingProduct
        fields = ['name', 'cost', 'size']

撰写回答