4

Entry オブジェクトの数が 5000 エントリを超える場合、django で次のことをより効率的に行う方法はありますか?

models.py

class Entry(models.Model):
    user = models.TextField(db_column='User', blank=True)
    date = models.DateTimeField(blank=True)

class Color(models.Model):
    color = models.TextField(blank=True)
    entry = models.ForeignKey(Entry)

そして、これらの各エントリのすべての色を取得したいとしましょう...

entrys = Entry.objects.all()

for e in entrys:
    print e.color_set.all()

各オブジェクトを特定のエントリに関連付けたいと考えています。たとえば、このような csv テーブルで。

user, color
john, blue
john, orange
bob, green
bob, red
bob, purple

すべてのエントリを確認するのに数秒かかります。より良い方法はありますか?

4

2 に答える 2

10

使用する必要がありますprefetch_related

entrys = Entry.objects.all().prefetch_related('color_set')

for e in entrys:
    print e.color_set.all()

n を実行する代わりに、2 つのクエリを実行します。1 つはエントリ用、もう 1 つは外部キー ルックアップ用です。

于 2016-03-09T14:55:40.323 に答える
2

前にコメントしたように、すべての色をEntryまとめて必要な場合は、すべてのオブジェクトを選択してColor並べ替えることができentryます。

colors = Color.objects.order_by('entry')

これで、これらのオブジェクトをループして、必要な方法で印刷できます。

for color in colors:
    print(color.entry.user, color.color)

# john, blue
# john, orange
# bob, green

または、この情報を次のように抽出できます。values_list

color_entries = list(colors.values_list('entry__user', 'color'))
# [('john', 'blue'), ('john', 'orange'), ('bob', 'green'), ...]
于 2016-03-09T14:47:23.230 に答える