如何在 Django 中有效地使用 _set.all()?
how to efficiently use _set.all() in django?
当 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 table 中。
user, color
john, blue
john, orange
bob, green
bob, red
bob, purple
浏览我的所有条目需要几秒钟的时间。有没有更好的方法?
正如我之前评论的那样,如果您只需要 Entry
的所有颜色,您可以 select 所有 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'), ...]
你应该使用prefetch_related
entrys = Entry.objects.all().prefetch_related('color_set')
for e in entrys:
print e.color_set.all()
它将执行 2 个查询,而不是执行 n 个查询,一个用于条目,一个用于外键查找
当 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 table 中。
user, color
john, blue
john, orange
bob, green
bob, red
bob, purple
浏览我的所有条目需要几秒钟的时间。有没有更好的方法?
正如我之前评论的那样,如果您只需要 Entry
的所有颜色,您可以 select 所有 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'), ...]
你应该使用prefetch_related
entrys = Entry.objects.all().prefetch_related('color_set')
for e in entrys:
print e.color_set.all()
它将执行 2 个查询,而不是执行 n 个查询,一个用于条目,一个用于外键查找