Django,查询过滤模型方法

olqngx59  于 2023-04-22  发布在  Go
关注(0)|答案(5)|浏览(151)

我有这些模型:

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:

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

我收到错误,例如

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

我如何才能做到这一点?

q1qsirdb

q1qsirdb1#

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

20jt8wwn

20jt8wwn2#

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

Bar.objects.foo_active()

你要做的就是:

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

看看docs

i1icjdpr

i1icjdpr3#

我也有类似的问题:我使用基于类的视图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)
e7arh2l6

e7arh2l64#

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

jjjwad0x

jjjwad0x5#

显然,正如伊格纳西奥所指出的那样,您不能在视图中查询模型方法,而是在视图中应用所需的过滤器逻辑。
例如,当check_condition是日期范围时:

class BarView(ListView):
    model = Bar
    template_name = "app/bar.html"

    def get_queryset(self):
        # Filter for a condition (here the condition is a date range)
        now = timezone.now().date()
        return Bar.objects.filter(foo__start_date__lte=now, foo__end_date__gte=now)

相关问题