2010-07-19 71 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