如何通过外键从与另一个模型相关的模型中检索特定对象?

时间:2019-09-10 18:38:49

标签: django django-models django-templates django-views

我正在构建一个django应用程序,该应用程序基本上可以显示新闻源(主题+一系列新闻项目)。主题和项目通过两个模型手动输入数据库中。

这两个模型:“ Feed”模型(描述新闻提要主题)和“ Feed_element”模型(描述在特定主题下输入的新闻项(“ feed”))。 Feed_element通过外键与Feed模型相关。

我想获得响应条件(feed_feed = True,请参阅附加的模型代码)和随附feed_elements的提要,我认为我可以使用select_related()在视图中一起编织。但这不起作用。

我无法确定视图语法。

型号

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models

# Create your models here.

class Feed(models.Model):
feed_name = models.CharField(max_length = 200, default = "country_name")
feed_current = models.TextField(max_length = 10000, default = "feed_current")
feed_country = models.CharField(max_length = 200, default = "feed_country")
feed_front = models.BooleanField(default = False)

def __str__(self):
return self.feed_name


class Feed_element(models.Model):
parent_feed = models.ForeignKey(Feed, on_delete = models.CASCADE,    related_name = "elements")
element_date = models.DateField()
element_short = models.TextField(max_length = 200, default = "element_short")
element_long = models.TextField(max_length = 200, default = "element_long")

def __str__(self):
return self.element_short

观看次数

# -*- coding: utf-8 -*-

from __future__ import unicode_literals

from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse, Http404, HttpResponseRedirect

from .models import Feed, Feed_element

def index(request, posted = None):


return render(request, 'trails/index.html', { 'feeds' :     Feed.objects.filter(feed_front = True),
'elements' :     Feed_element.objects.select_related('parent_feed').all()
}
)

模板

{% if feeds %}
    {% for feed in feeds %}
       <div class = "column">
    <h2 align="center" font-weight: normal> FEED: {{ feed.feed_name }}</h2>
    {% for element in elements %}
    <li>
    <a>{{ elements.element_short }} <br> | </a>
    </li>
    {% endfor %}
    </div>
{% endfor %}
    {% endif %}

我希望获得一列,其顶部为Feed的名称,其下为Feed元素的列表。相反,我得到的是:

1)项目符号点列表(元素列表),其中包含元素总数(我已经进入DB的提要元素数量),而不是特定提要的与外键相关的元素,

2)但为空白(文本不会出现)

1 个答案:

答案 0 :(得分:0)

您想得太多。 Feed个实例将具有一个管理器,可让您获取其关联的元素-请参阅related objects文档。在这种情况下,您已经在fk上指定了related_name,所以这就是管理员的名字。

在您看来,您无需显式加载元素-只需设置所需的提要并将提要传递到模板上下文中即可。然后在模板中,访问elements管理器,如下所示:

{% for element in feed.elements.all %}

请注意,这没有使用select_related。这是为了优化多对一或一对一关系中的查询,因此如果您有想要获取的特定feed元素而不必再次访问数据库以获取其相关的{{1} }。它不涉及一对一的关系,例如您在feed到feed元素之间的关系。您可以尝试使用feed来避免重复的数据库查询,以获得相关的prefetch_related-类似:

feed_elements

这并没有Feed.objects().filter(feed_front=True).prefetch_related('elements') 有用,因为它仍然必须进行多个数据库查询,但是它会为您分组-docs还会提供详细信息。