Django,从模型方法查询过滤

时间:2010-02-16 22:14:24

标签: python django django-models django-queryset django-orm

我有这些模特:

def Foo(Models.model):
    size = models.IntegerField()
    # other fields

    def is_active(self):
         if check_condition:
              return True
         else:
              return False

def Bar(Models.model):
     foo = models.ForeignKey("Foo")
     # other fields

现在我想要查询具有活动Foo的条形码:

Bar.objects.filter(foo.is_active())

我收到错误,例如

SyntaxError at /
('non-keyword arg after keyword arg'

我怎样才能做到这一点?

5 个答案:

答案 0 :(得分:32)

您无法查询模型方法或属性。在查询中使用其中的条件,或使用列表推导或genex在Python中过滤。

答案 1 :(得分:29)

您也可以使用自定义管理器。然后你可以运行这样的东西:

Bar.objects.foo_active()

你所要做的就是:

class BarManager(models.Manager):
    def foo_active(self):
       # use your method to filter results
       return you_custom_queryset

查看docs

答案 2 :(得分:18)

我有类似的问题:我使用基于类的视图object_list,我不得不按模型的方法进行过滤。 (将信息存储在数据库中不是一种选择,因为该属性是基于时间的,我将不得不创建一个cronjob和/或...... 没办法

我的回答是无效的,我不知道它将如何扩展到更大的数据;但是,它有效:

q = Model.objects.filter(...)...
# here is the trick
q_ids = [o.id for o in q if o.method()]
q = q.filter(id__in=q_ids)

答案 3 :(得分:10)

您无法对方法进行过滤,但是如果Foo上的is_active方法检查Foo上的属性,则可以使用双下划线语法,如Bar.objects.filter(foo__is_active_attribute=True)

答案 4 :(得分:0)

class Page(models.Model):
    category = models.ForeignKey(Category)
    title = models.CharField(max_length=128)
    url = models.URLField()
...

class Category(models.Model):
    ...
    open = models.BooleanField(default=True)

对于这种类型的条件,你可以使用简单的过滤器。

Page.objects.filter(category__open=True)