使用具有模型继承的过滤器

时间:2014-11-01 08:15:49

标签: python django django-filter

之前我成功使用过Django Filters来过滤这样的模型:

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 个答案:

答案 0 :(得分:1)

添加到您的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']