我的模特:
class NewsItem(models.Model):
title = ...
content = ...
class Image(models.Model):
newsItem = models.ForeignKey(NewsItem)
url = ....
我想显示50 NewsItems与他们的图像(每个NewsItem 2-5图像)。--我只能用一到两个查询--?我可以查询“回溯”相关信息吗?
我找到了一些关于它的信息,但不知道如何在模板中显示_related项(在我的例子中,“向后”_related项是图像)。链接是http://blog.roseman.org.uk/2010/01/11/django-patterns-part-2-efficient-reverse-lookups/
文章是在2010年1月发布的--也许还有更有效的方式?
发布于 2011-06-22 22:40:04
下面是一个更容易理解的示例(命名)。
谢谢丹尼尔·罗斯曼的setdefault
!我每天都在堆里学东西。我一直在使用丑陋的try/except
块来解决同样的问题。
查看:
newsitems = NewsItem.objects.all()[0:50]
related_images = Image.objects.filter(newsitem__in=newsitems)
newsitem_images_map = {}
for image in related_images:
# start appending to a list keyed by the newsitem ID for all related images
newsitem_images_map.setdefault(image.newsitem_id, []).append(image)
for newsitem in newsitems:
# set an attribute on the newsitem that is the list created above
newsitem.images = newsitem_images_map.get(newsitem.id)
# this attribute is accessible from the template.
模板:
{% for newsitem in newsitems %}
{{ newsitem.title }}
{% for image in newsitem.images %}
{{ image }}
{% endfor %}
{% endfor %}
发布于 2012-10-04 20:40:51
qs = NewsItem.objects.all()
obj_dict = dict([(obj.id, obj) for obj in qs])
objects = Image.objects.filter(newsitem__in=qs)
relation_dict = {}
for obj in objects:
relation_dict.setdefault(obj.newsitem_id, []).append(obj)
for id, related_items in relation_dict.items():
obj_dict[id]._related_images = related_items
...
{% for newsitem in obj_dict %}
{% for image in newsitem._related_images %}
您将在两个查询中获取相关数据。
更新: Django 1.4中的可用的新方法相关
顺便说一句,prefetch_related不适用于不推荐的泛型视图direct_to_template。
newitems = NewItem.objects.prefetch_related('images')
发布于 2011-06-23 21:43:30
您的场景不是反向关系:
news_item.images # forward relation
image.newsitem_set # reverse relation
所以,你要做的就是:
news_items = NewsItem.objects.select_related().all()[:50]
并将其传递给模板,图像对象应该已经被缓存。
https://stackoverflow.com/questions/6446549
复制相似问题