使用django在表上创建一个简单的连接

时间:2010-07-19 11:22:21

标签: sql django django-models

我在django中有一个名为MainData的数据模型,它是在名为“my_data”的表上创建的。 我想通过django API在这个表的顶部进行简单的计算。查询如下:

select main.id,                 
       sum(main.num - secondary.num) as result

from (select * from my_data 
      where some_value > 10) as main,

      my_data as secondary

where 
      main.id != secondary.id and
      main.a  > secondary.a
group by main.id

MainData模型具有所有相关字段(num,id,a和some_value)。 如何通过django实现此查询? (我试图避免使用直接SQL)

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

试试这个问题,看起来很相似:

Django equivalent for count and group by

答案 1 :(得分:0)

这是一个艰难的。 Django并没有真正提供一种简单的方法来连接表,而不需要使用SQL。这是我可以在不使用SQL的情况下提出的最好的方法。 results变量中返回的结果与您提供的SQL查询相同;但是,执行效率稍差。

from django.db.models import Sum, Count
from your_app.models import MyData
results = []
for m in MyData.objects.filter(some_value__gt=10):
    result = MyData.objects.filter(a__lt=m.a).aggregate(
        count=Count('num'), sum=Sum('num'))
    if result['count']:
        results.append({
            'id': m.id,
            'result': result['count'] * m.num - result['sum']})
print results

你还应该看看Django为QuerySets提供的extra()raw()方法,它们可以让你在保持Djangoesque的同时高效地进行诸如你的复杂查询。