Django - ForeignKey问题。有多少个DB访问?

时间:2011-07-12 23:55:41

标签: django foreign-keys django-database

我目前正在使用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对象?

3 个答案:

答案 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)