71

I have these models:

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

Now I want to query Bars that are having active Foo's as such:

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

I am getting error such as

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

How can I achieve this?

4

5 回答 5

39

您不能查询模型方法或属性。要么在查询中使用其中的条件,要么在 Python 中使用列表理解或genex 进行过滤。

于 2010-02-16T22:22:03.300 回答
32

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

Bar.objects.foo_active()

你所要做的就是:

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

查看文档

于 2014-01-26T12:00:32.277 回答
24

我有类似的问题:我正在使用基于类的视图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)
于 2013-03-05T13:15:20.750 回答
10

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

于 2010-02-16T22:24:29.893 回答
-1
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)
于 2016-04-23T09:00:02.480 回答