2

我目前正在使用 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 表,我可以这样做:

    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,因为papers 是一个QuerySet。如果我尝试使用循环,它可能会为每个纸质对象进行一次查询,对吧?

仅供参考,City 表有 1000 列,每个 City 有 1-1000 个 Paper 对象,每个 Paper 对象大约有 10 个 Article 对象。

任何帮助将不胜感激。

谢谢你。

编辑:假设我有一个城市查询集(上图),有没有办法在单个查询中获取所有文章对象?

4

3 回答 3

1

我不能使用papers.article_set,因为papers 是一个QuerySet。如果我尝试使用循环,它可能会为每个纸质对象进行一次查询,对吧?

如果您遍历查询集,则只会执行一条 SQL 语句。Django 缓存了整个查询集,但如果你只有 1000 行,这将没有问题。

如果您遍历大型查询集,请使用 queryset.iterator():

https://docs.djangoproject.com/en/1.3/topics/db/optimization/

于 2011-07-13T12:01:58.473 回答
1

您可以像这样获得执行的查询(确保在您的 settings.py 中 DEBUG=True):

 from django.db import connection
 connection.queries

更多细节可以在Django DB FAQ中找到。

于 2011-07-13T12:34:45.800 回答
0
articles = Article.objects.all(paper__city__name='Toronto', paper__price__lt=5)
于 2011-07-13T08:50:41.063 回答