0

我有 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 }}并且它不会产生任何查询。

4

1 回答 1

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)将缓存相关的 Person 和相关的 City

select_related通过创建 SQL 连接并在 SELECT 语句中包含相关对象的字段来工作。为此, select_related 在同一个数据库查询中获取相关对象。但是,为了避免通过“多”关系连接而产生更大的结果集,select_related 仅限于单值关系 - 外键和一对一。

prefetch_related另一方面,对每个关系进行单独的查找,并在 Python 中进行“加入”。这允许它预取多对多和多对一对象,这是使用 无法完成select_related的,除了由select_related.

于 2013-07-24T21:26:47.880 回答