2011-08-14 10 views
1

Djangoを初めて使用しています。私はモデルを持っており、モデルを照会する必要があります。このDjangoモデルを照会するより良い方法

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' 

質問:私はこの方法でデータベースを照会する必要があり、今

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) 

モデルがこれです、私はモデルのクエリAPIを使用すべきか、私はRAW SQLを使用する必要があります?

よろしく、

答えて

2

あなたは、モデルクエリーAPIでそれを行うことができますが、あなたはすでにあなたが巨大な高みに拡張する必要がある場合は、長期的にはより効率的になるだろう書かれた生のSQLを持っている場合。

Pro of raw SQL:より効率的にデータベースにヒットします。 pro of query api:SQL django以外の人が将来、あなたのコードをメンテナンスし拡張することができます。

私はあなたの質問が意味するものを理解するのに苦労している限り、djangoのオーマンによってデータベースとやり取りしています。

#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は、関連するデータを取得するために関係を歩いて、あなたがしたいプライマリ・オブジェクト(複数可)の観点で考え始めています。オブジェクトに関連するすべてのデータは、オブジェクト/ドット表記法を介して利用でき、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を好きになっていると思います。再度、感謝します。よろしく。 –

関連する問題