我是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?
最诚挚的问候,
答案 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