2014-07-11 40 views
0

我有一个带有计算字段的Django模型。举个例子:使用django_filter对模型的计算方法进行过滤

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',) 

我在这里做错了什么?

回答

3

incremented在该模型上不是字段(即Field的一个实例),它只是一个python函数。在数据库方面,它不存在,所以不能被过滤。

直到#14030已修复,您无法轻松过滤这样的计算值,您必须使用extra。因此,例如通过incremented获得与2 number所有对象:

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

要使用与django-filter库,你需要重写你的Filteraction

def action(query, value): 
    return query.extra(where=['number + 1 = %s'], params=[value]) 

class F(django_filters.FilterSet): 
    incremented = django_filters.NumberFilter(action=action) 
    class Meta: 
     model = MyModel 
     fields = ['incremented'] 
+0

谢谢。我认为这个“行动”克瓦格正是我正在寻找的 - 在文档中没有看到它。 – jdotjdot

相关问题