将模型对象与相关对象组合为属性

时间:2013-07-24 04:41:27

标签: django

我有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 }}的模板中,它不会产生任何疑问。

1 个答案:

答案 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支持的关系。