4

当 Entry 对象的数量大于 5000 个条目时,django 有没有办法更有效地执行以下操作?

模型.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,一个用于条目,一个用于外键查找

于 2016-03-09T14:55:40.323 回答
2

正如我之前评论过的,如果您只需要 a 的所有颜色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 回答