2011-08-14 65 views
1

我是Django的新手。我有一個模型,現在我需要查詢模型。更好的方法來查詢這個Django模型

的模式是這樣的:

from django.db import models 
import datetime 

class Position(models.Model): 
    website_position = models.IntegerField() 
    category = models.ForeignKey('Category') 
    directorio = models.ForeignKey('Directorio') 

class Category(models.Model): 
    n_category = models.CharField(max_length=100) 
    category_position = models.IntegerField() 
    date_inserted = models.DateTimeField(auto_now_add=True) 
    date_last_update = models.DateTimeField(auto_now_add=True) 

class Directorio(models.Model): 
    website_name = models.CharField(max_length=200) 
    website_url = models.URLField() 
    activated = models.BooleanField() 
    date_inserted = models.DateTimeField(auto_now_add=True) 
    date_last_update = models.DateTimeField(auto_now=True) 
    categories = models.ManyToManyField(Category, through=Position) 

現在,我需要查詢數據庫以這樣的方式

select dc.n_category, dp.website_position, dd.website_name, dd.website_url, dd.activated 
from directorio_category as dc 
join directorio_position as dp on dc.id = dp.category_id 
join directorio_directorio as dd on dp.directorio_id = dd.id 
where dd.activated = 'true' 

問:我應該使用模型查詢API或我應該使用RAW SQL ?

最好的問候,

回答

2

您可以用模型查詢API做到這一點,但如果你已經有了原始的SQL編寫的將是從長遠來看,更有效的,如果你要擴展到巨大的高度。

原始SQL的Pro:更高效地擊中數據庫。 查詢api的專業版:非SQL django人將能夠在未來主持並擴展您的代碼。

我一直在通過django的orm與數據庫交互,所以我一直在努力弄清楚你的查詢甚至意味着什麼。

#I think this gets what you want 
positions = Position.objects.filter(directorio__activated=True).order_by('category__n_catgory', 'website_position') 
for position in positions: 
    print position.category.n_category, position.website_position, position.directorio.website_name, position.website.website_url, position.website.activated 

的關鍵,從SQL遷移到Django的ORM也開始想在主對象(S)你想的方面,然後走關係,以獲得相關數據。所有與對象有關的數據都可以通過對象/點符號來獲得,並且由於django ORM的懶惰,大部分的數據在您索要之前都不會被檢索到。

上述代碼按類別獲取每個位置,然後遍歷關係以獲取其他數據。另一個版本的代碼可能會得到每個活動網站,然後顯示其類別和位置:

websites = Directorio.objects.filter(activated=True).order_by('website_name') 
for website in websites: 
    print website.website_name, website.website_url, website.activated 
    for position in website.position_set.all().order_by('category__n_category'): 
     print " -- ", position.category.n_category, position.website_position 
+0

太棒了!謝謝你的幫助。我是一個SQL人員,但我想我開始喜歡Django ORM。再次感謝。問候。 –

相關問題