2010-07-19 57 views
2

我在django中创建了一个称为MainData的数据模型,该模型创建在名为“my_data”的表的顶部。 我想通过django API在此表上执行一个简单的计算。查询如下:使用django在表上创建一个简单的连接

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)

感谢您的帮助

+1

感谢大家谁回答 - 做上述可能是不可能在django由于加入。 如果你重新编写你的查询,而不是通过连接来使用一个组,你可以使用inner select(从...选择main.id,(选择)),你可以使用“extra {select = ...}) 原始SQL可能在这里是必要的... – Liz 2010-07-20 20:21:56

回答

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 

你也应该有一个看看extra()raw()方法Django提供了QuerySets,这将让你做出复杂的查询,如您高效,同时仍保持事Djangoesque。

+0

感谢您的帮助,我想如果我想效率最好的方法是重写我的查询使用内部选择,而不是django支持的常规联接。无论如何,似乎直接SQL是最好的方式。 – Liz 2010-07-20 06:23:18

相关问题