python - 如何根据与另一个模型的关系在模板视图中查询另一个 Django 模型
问题描述
我有这些模型
class Protocol(models.Model):
name = models.CharField(max_length=200)
class Description(models.Model):
name = models.CharField(max_length=200)
protocol = models.ForeignKey(Protocol)
class Trait(models.Model):
desc = models.CharField(max_length=200)
protocol = models.ForeignKey(Protocol)
class State(models.Model):
desc = models.CharField(max_length=200)
trait = models.ForeignKey(Trait)
class Expression(models.Model):
state = models.ForeignKey(State)
description = models.ForeignKey(Description)
所以一个协议(例如协议“A”)由一定数量的特征(例如身高、体重、颜色)组成。每个特征可以有多个状态(例如低、中、高)。然后,描述是与特定协议相关的表达式的集合。例如,描述 #1 由协议“A”组成,由两个表达式组成:身高 -> 低,体重 -> 高;但未指定特征颜色。
基本上,我想做的是在模板视图中显示链接到所选描述的特定协议的所有特征,然后显示相应的表达式,对于某些特征也可以为空。
像这样:
| Trait | Expression |
|--------+------------|
| height | |
| weight | high |
| color | blue |
使用外壳,我可以轻松返回我需要的东西
# Select a Description
desc = Description.objects.first()
# Get the protocol
protocol = desc.protocol
# Get all traits in the selected protocol
all_traits = protocol.trait_set.all()
# Get all the expressions in this description
expressions = desc.expression_set.all()
# Print all traits within the selected protocol and their related expression (if any)
for trait in all_traits:
print(trait.desc)
expr = expressions.filter(state__trait_id = trait.id).first()
print(expr.state.desc)
但是,我无法弄清楚如何在视图中执行此操作,尤其是我想继续使用 DetailView,但如果不可能,这不是严格要求。有什么办法吗?
谢谢
解决方案
我找到了一种方法来做到这一点,尽管我并不完全满意,因为我觉得这不是一个非常优雅的解决方案。
description_extras.py
我在我的应用程序内的目录中创建了一个templatetags/
(不要忘记__init__.py
将其视为一个包)
在里面description_extras.py
我创建了一个自定义过滤器,如下所示:
from django import template
register = template.Library()
@register.filter
def expr_trait(expression,trait_id):
return expression.filter(state__trait_id = trait_id).first()
然后在模板中,我加载自定义过滤器
{% load description_extras %}
然后我可以这样调用过滤器:
{% for trait in description.protocol.trait_set.all %}
<tr>
<td>{{ trait.desc }}</td>
<td>{{ description.expression_set.all|expr_trait:trait.id }}</td>
</tr>
{% endfor %}
推荐阅读
- javascript - OpenLayers OpenMaps Circle 在地图上绘制时大小不正确
- mysql - Mysql:与 json_extract 一起使用时,where in 不返回任何行
- linux - Linux Ncurses Pad Smearing(文本滚动尝试)
- sql - 基于访问用户输入的 SQL 动态查询问题
- javascript - 在 iOS 13.1 版本中,当输入的光标不可见时?
- c - memset 函数的分段错误问题
- java - 通过 JPanel 进行 JComponent 裁剪
- angular - 从源“xxxx”访问“xxx/.well-known/openid-configuration”处的 XMLHttpRequest 已被 CORS 阻止
- python - 如何在 Keras 中正确地制作自定义损失函数
- iot - Contiki-NG 是否支持 Radio Duty Cycling (RDC)?