<p>您可以预取一个人的所有相关照片,并根据此人的最新拍摄日期进行过滤,如下所示:</p>
<pre><code>from django.db.models import F, Max, Prefetch
person_qs = Person.objects.annotate(
latest_photo_date=Max('personphoto__date_captured')
).prefetch_related(
Prefetch(
'personphoto_set',
queryset=PersonPhoto.objects.annotate(
person_latest_photo_captured=Max('person__personphoto__date_captured')
).filter(
date_captured=F('person_latest_photo_captured')
),
to_attr='latest_photos',
)
)
</code></pre>
<p>所有最新的<code>PersonPhoto</code>实例都将作为<code>Person</code>实例的<code>latest_photos</code>属性中的列表提供,因此您可以如下方式访问它们:</p>
<pre><code>for person in person_qs:
print(f'Latest images for {person.name} taken on {person.latest_photo_date}:')
for photo in person.latest_photos:
print(f'Photo ID: {photo.id} - Captured at: {photo.date_captured}')
print()
</code></pre>
<p>输出:</p>
<pre><code>Latest images for B taken on 2021-08-19:
Photo ID: 10 - Captured at: 2021-08-19
Photo ID: 11 - Captured at: 2021-08-19
Latest images for A taken on 2021-08-11:
Photo ID: 5 - Captured at: 2021-08-11
Photo ID: 4 - Captured at: 2021-08-11
</code></pre>
<p>这将总共执行两个查询,一个查询人员列表,另一个查询获取每个人的所有过滤相关照片</p>