我正在构建一个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)但为空白(文本不会出现)
答案 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还会提供详细信息。