django - 模板中不可迭代的外键对象
问题描述
我有一个部分、小节和子句的基本模型。1 个部分可以包含多个子部分。每个小节可以包含多个子句。模型看起来像:
**models.py**
class Clause(models.Model):
number = models.CharField(max_length=8, unique=True)
requirements = models.TextField(max_length=2000, unique=False, blank=True, null=True)
documentation = models.TextField(max_length=2000, unique=False, blank=True, null=True)
class Subsection(models.Model):
number = models.CharField(max_length=5, unique=True)
name = models.CharField(max_length=150, unique=False)
descriptor = models.TextField(max_length=2000, unique=False, blank=True, null=True)
clause = models.ForeignKey(Clause, on_delete=models.DO_NOTHING, related_name="clause")
class Section(models.Model):
number = models.CharField(max_length=2, unique=True)
name = models.CharField(max_length=150, unique=False)
descriptor = models.TextField(max_length=2000, unique=False, blank=True, null=True)
subsection = models.ForeignKey(Subsection, on_delete=models.DO_NOTHING, related_name="subsection")
调用所需部分的基本视图函数:
**views.py**
def main(request):
form = MainSearchForm()
user = request.user
sections = []
show_results = True
if 'query' in request.GET:
show_results = True
query = request.GET['query'].strip()
if len(query) <= 2:
sections = Section.objects.filter(number__iexact=query)
if sections:
records = sections
tpl = "display_console.html"
context = {'user': user, 'records': records, 'form': form}
return render(request, tpl, context)
else:
tpl = "main.html"
context = {'user': user, 'form': form}
return render(request, tpl, context)
不幸的是,我无法让我的模板返回我的小节数据。以下返回一个 'Subsection' object is not iterable 错误:
**template**
<table class="section_tb">
{% if records %}
{% for record in records %}
<tr>
<td>{{ record.number }}</td><td>{{ record.name }}</td>
</tr>
{% for item in record.subsection %}
<tr>
<td>{{ item.number }}</td><td>{{ item.name }}</td>
</tr>
<tr>
<td colspan=2>{{ item.descriptor }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
{% else %}
{% endif %}
代替:
{% for item in record.subsection.all %}
为了:
{% for item in record.subsection %}
删除错误消息,但不返回任何数据。有什么明显的我做错了吗?
解决方案
这是因为 Section 只能有一个 Subsection。因此,您可以在{{record.subsection}}
此处不需要 forloop 即可访问该小节。
提示记住,当您使用一对多时,其中一个是定义外键的位置。存储外键的模型将始终只存储一个外键。
如果您想从另一端访问许多外键,请使用model_name_in_lowercase_set
或定义相关名称,models.ForeignKey(..., related_name="something")
然后您可以调用something_set
推荐阅读
- microsoft-teams - 我的要求是使用 Microsoft Graph Restful API 向 MS-Team 用户发送通知消息
- c# - Angular + .Net Core WebApi 在 Zebra 打印机上打印标签
- javascript - 过滤数组数据
- javascript - 通过javascript创建日历
- c# - Crystal Report:找不到文件异常
- android - 如何防止Android中的重复类错误
- python - 谁能告诉我为什么会出现这个错误?,我已经安装了 datareader 包
- c# - 作为原生 Android 服务运行的 C# 应用程序
- treeview - Outsystems:来自数据库数据/列表的动态树视图
- laravel-5 - $faker->word 如何获得独特的价值?