查询这个Django模型的更好方法

时间:2011-08-14 14:31:54

标签: django django-models

我是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?

最诚挚的问候,

1 个答案:

答案 0 :(得分:2)

你可以使用模型查询api来完成它,但是如果你已经编写了原始sql,那么如果你必须扩展到更高的高度,那么它将在长期内更有效。

原始SQL专业版:更有效地访问数据库。 查询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的关键是开始考虑你想要的主要对象,然后走关系来获取相关数据。所有与对象相关的数据都可以通过对象/点表示法获得,并且由于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