首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django:向后ForeignKey查询

Django:向后ForeignKey查询
EN

Stack Overflow用户
提问于 2011-06-22 21:03:15
回答 3查看 884关注 0票数 3

我的模特:

代码语言:javascript
运行
复制
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月发布的--也许还有更有效的方式?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-06-22 22:40:04

下面是一个更容易理解的示例(命名)。

谢谢丹尼尔·罗斯曼的setdefault!我每天都在堆里学东西。我一直在使用丑陋的try/except块来解决同样的问题。

查看:

代码语言:javascript
运行
复制
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.

模板:

代码语言:javascript
运行
复制
{% for newsitem in newsitems %}
    {{ newsitem.title }}
    {% for image in newsitem.images %}
        {{ image }}
    {% endfor %}
{% endfor %}
票数 2
EN

Stack Overflow用户

发布于 2012-10-04 20:40:51

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
newitems = NewItem.objects.prefetch_related('images')
票数 2
EN

Stack Overflow用户

发布于 2011-06-23 21:43:30

您的场景不是反向关系:

代码语言:javascript
运行
复制
news_item.images     # forward relation

image.newsitem_set  # reverse relation

所以,你要做的就是:

代码语言:javascript
运行
复制
news_items = NewsItem.objects.select_related().all()[:50]

并将其传递给模板,图像对象应该已经被缓存。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6446549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档