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)

または、2 つを組み合わせることもできます。

    papers = cities.paper_set.filter(city=cities, price < 5)

(これはより効率的でしょうか?)

問題は、上記の「論文」からすべての記事を効率的に取得する方法を見つけることです。

papers は QuerySet であるため、papers.article_set は使用できません。そして、ループを使用しようとすると、おそらく紙のオブジェクトごとに 1 回クエリを作成することになりますよね?

参考までに、City テーブルには 1000 列があり、City ごとに 1 ~ 1000 個の Paper オブジェクトがあり、Paper オブジェクトごとに約 10 個の Article オブジェクトがあります。

どんな助けでも本当に感謝します。

ありがとうございました。

編集:都市クエリセット(上記)があると仮定すると、単一のクエリですべての記事オブジェクトを取得する方法はありますか?

4

3 に答える 3

1

papers は QuerySet であるため、papers.article_set は使用できません。そして、ループを使用しようとすると、おそらく紙のオブジェクトごとに 1 回クエリを作成することになりますよね?

クエリセットをループすると、1 つの 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 に答える