我有2个相关模型,比如说
class Person(models.Model):
name = CharField(max_length=100)
class PersonPicture(models.Model):
image = ImageField(...)
person = ForeignKey(Person)
我发送到模板context['persons']=Person.objects.all()
并访问相关经理。
{% for p in persons %}
{{ p.name }}
{{ p.personpicture_set.all.0.image }}
{% endfor %}
此{{ p.personpicture_set.all.0.image }}
为for循环中的每个项目生成一个查询。
有没有办法在人物模型中与“人物”图像相关联,因此只有Person.objects.all()
的一个查询。在我可以{{ p.images_custom_attr.0 }}
的模板中,它不会产生任何疑问。
答案 0 :(得分:0)
您可以使用select_related()
或prefetch_related()
。至于差异,来自Django doc -
select_related()
尽可能地跟随外键。如果你有 以下型号:from django.db import models class City(models.Model): # ... pass class Person(models.Model): # ... hometown = models.ForeignKey(City) class Book(models.Model): # ... author = models.ForeignKey(Person) ...then a call to
Book.objects.select_related().get(id=4)
将缓存相关人员 和相关的城市
并且
另一方面,
select_related
通过创建SQL连接并包含字段来工作 SELECT语句中的相关对象。为此原因,select_relate
d获取相同数据库查询中的相关对象。 但是,要避免由此产生的更大的结果集 加入'many'关系时,select_related仅限于 单值关系 - 外键和一对一。
prefetch_related
对每个进行单独查找 关系,并在Python中“加入”。这允许它 预取多对多和多对一对象,这是无法完成的 使用select_related
,除了外键和一对一select_related
支持的关系。