django模型,使用extra()在连接表上应用filter()

时间:2013-03-14 08:52:40

标签: django django-models

我正在尝试这个:

count = UserCheck.objects.filter(user=puser, fixture__competition__name__icontains='gold',
                                   fixture__date__gte='2013-02-11',
                                   fixture__date__lte='2013-05-24', year=2013).extra(
                                   where=["WEEKOFYEAR(fixture__date) = %s" %week]).exclude(result=0).count()

问题是我无法使用extra()过滤的WEEKOFYEAR(fixture__date)部分。我怎样才能做到这一点。这可能吗?

PS:我正在使用MySQL(和django 1.4)

1 个答案:

答案 0 :(得分:3)

使用extra QuerySet修饰符时,您不再使用Django的ORM。您使用的是“纯”SQL,因此无法使用__表示法访问相关模型,在您的情况下fixture__date不是有效的列名。但是,必须记住,表在Django中以特定方式命名。所以你可以使用:

count = UserCheck.objects.filter(user=puser, fixture__competition__name__icontains='gold',
                                   fixture__date__gte='2013-02-11',
                                   fixture__date__lte='2013-05-24', year=2013).extra(
                                   where=["WEEKOFYEAR(app_fixture.date) = %s" %week]).exclude(result=0).count()

其中app是指包含Fixture模型的应用。

简而言之,对于应用程序中的每个模型,Django创建表<app>_<model>,当您想要引用该模型时,可以将其与extra子句一起使用。