我目前正在使用Django,我的模型是这样的。
class City(models.Model):
name = models.CharField(max_length=255, primary_key=True)
url = models.URLField()
class Paper(models.Model):
city = models.ForeignKey(City)
name = models.CharField(max_length=255)
price = models.IntegerField()
class Article(models.Model):
paper = models.ForeignKey(Paper)
name = models.CharField(max_length=255)
我试图通过过滤城市名称和纸张价格来获取City对象,多个Paper对象和多个Article对象。
要搜索City表格,我可以这样做:
cities = City.objects.get(pk='Toronto')
获取Paper对象:
papers = Paper.objects.filter(city=cities, price < 5)
或者我甚至可以将两者结合起来:
papers = cities.paper_set.filter(city=cities, price < 5)
(这会更有效吗?)
问题是找到一种有效的方法来获取上述“论文”中的所有文章。
我不能使用papers.article_set,因为论文是一个QuerySet。如果我尝试使用循环,它可能会对每个纸质对象进行一次查询,对吧?
仅供参考,City表有1000列,每个城市有1-1000个Paper对象,每个Paper对象大约有10个Article对象。
任何帮助都将非常感激。
谢谢。
编辑: 假设我有一个城市QuerySet(上面),有没有办法在一个查询中获取所有Article对象?
答案 0 :(得分:1)
我不能使用papers.article_set,因为论文是一个QuerySet。如果我 尝试使用循环它可能会进行一次查询 纸对象,对吗?
如果循环查询集,则只执行一个SQL语句。 Django缓存整个查询集,但如果你只有1000行,那就没问题了。
如果循环遍历大型查询集,请使用queryset.iterator():
https://docs.djangoproject.com/en/1.3/topics/db/optimization/
答案 1 :(得分:1)
你可以像这样得到执行的查询(确保你的settings.py中的DEBUG = True):
from django.db import connection
connection.queries
更多详细信息,请参阅Django DB FAQ。
答案 2 :(得分:0)
articles = Article.objects.all(paper__city__name='Toronto', paper__price__lt=5)