我想实现一些在查询集额外的选择,并希望所需要的表添加到使用select_related方法查询表池,以便为“__”语法中受益。使用select_related和额外条款
这里是一个简单的模型的例子:
from django.db import models
# Create your models here.
class testA(models.Model):
code = models.TextField(unique = True)
date = models.DateTimeField(auto_now_add = True)
class testB(models.Model):
text = models.TextField()
a = models.ForeignKey(testA)
这里是我想建立查询:
SELECT (extract(hour from testa.date)) AS hour, testb.text FROM testb INNER JOIN testa ON (testb.a_id = testa.id)
因此,这里是我如何建造起来的Python:
testB.objects.all().select_related('a').extra(select = {'hour' : 'extract(hour from testa.date)'}).values('hour','text')
不过在Django删除他看到我没有使用“种皮”表(因为“价值”的时候select_related声明)。因此产生的SQL查询失败:
SELECT (extract(hour from testa.date)) AS "hour", "testb"."text" FROM "testb"
如果我删除了“价值”的声明,它工作正常:
SELECT (extract(hour from testa.date)) AS "hour", "testb"."id", "testb"."text", "testb"."a_id", "testa"."id", "testa"."code", "testa"."date" FROM "testb" INNER JOIN "testa" ON ("testb"."a_id" = "testa"."id")
但我必须把价值观声明,因为我想使聚集在“数按对象日期小时分组的b个对象“:
testB.objects.all().select_related('a').extra(select = {'hour' : 'extract(hour from testa.date)'}).values('hour').annotate(count = Count('pk'))
那么实现这一目标的好方法是什么? “计算由另一个对象中的东西分组的对象”?或者是否有办法“强制”django保留“select_related”表格,即使他认为它们是无用的?
PS:我知道我可以使用额外的语句的“表”的说法,但在这种情况下,我将不得不重写我的加盟,我想
如果它最初是为了数据可视化而制作的,那正是我正在寻找的。我正在尝试构建的工具是一个允许用户通过“书写”这样的句子来查询数据库的工具:“我想要计算ObjectB.date> 20100101并且ObjectC.code ='foo'groupe的ObjectA通过ObjectA.code和ObjectC.category“ 用户界面是ajax,当用户选择要查询的第一个”模型“时,过滤器和按选项分组填充可能的值。 现在我正在尝试使用SQLAlchemy,但我会看看django-cube 谢谢 – 2010-07-20 07:50:04