使用django_filter过滤模型的计算方法

时间:2014-07-11 20:00:32

标签: django methods django-rest-framework django-filter

我有一个带有计算字段的Django模型。举个例子:

class MyModel(models.Model):
    number = models.IntegerField(default=3)

    @property
    def incremented(self):
        return self.number + 1

我想过滤这个属性,所以我尝试了以下内容:

class ModelFilter(django_filter.FilterSet):
    class Meta:
        model = MyModel
        fields = ('incremented',)

这不起作用,也没有这样做:

class ModelFilter(django_filter.FilterSet):
    incremented = django_filter.NumberFilter(lookup_type='exact')
    class Meta:
        model = MyModel
        fields = ('incremented',)

我在这里做错了什么?

1 个答案:

答案 0 :(得分:5)

incremented不是该模型上的字段(即Field的实例),它只是一个python函数。在数据库方面,它并不存在,因此无法过滤。

在修复#14030之前,您无法轻松过滤此类计算值,您必须使用extra。例如,通过number获取incremented为2的所有对象:

MyModel.objects.extra(where=['number + 1 = %s'], params=[3])

要将其与django-filter库一起使用,您需要覆盖action的{​​{1}}:

Filter