Django如何将两个不同应用的模型数据传递到第三个应用的模板表格
问题根源
你传入模板的deployment是Deployment模型的全量查询集(多个对象的集合),直接调用{{ deployment.name }}无法取到单个对象的属性;同时你没有建立AccountRecord和Deployment数据的对应关系,自然无法在遍历账户列表时匹配到对应的部署信息。
解决方案
根据你的业务场景可以选择以下三种方案:
方案1:新增外键关联(最推荐,符合Django ORM设计规范)
首先给AccountRecord新增外键关联Deployment,修改app2/models.py:
from app1.models import Deployment class AccountRecord(models.Model): name = models.CharField(max_length=255, blank=True) file_name = models.CharField(max_length=255, blank=True) national_id = models.CharField(max_length=255, default="") # 新增外键,on_delete参数根据你的业务需求调整,示例为级联删除 deployment = models.ForeignKey(Deployment, on_delete=models.CASCADE, related_name="account_records", blank=True, null=True)
修改完成后执行makemigrations和migrate命令完成数据库迁移,后续新增AccountRecord时绑定对应Deployment即可。
为了避免查询时出现N+1性能问题,修改app3/views.py添加查询优化逻辑:
class IndexView(LoginRequiredMixin, ListView): model = AccountRecord template_name = "tableview/table_view.html" paginate_by = 25 # 新增select_related关联查询 def get_queryset(self): return AccountRecord.objects.select_related("deployment").all() # 不需要再手动传入Deployment查询集,可删除原有get_context_data逻辑
最后修改模板对应位置直接取值即可:
<td>{{ account.deployment.name|default:"无关联部署" }}</td>
方案2:按顺序打包两个独立列表(无需修改表结构,适合无关联但要按顺序一一对应的场景)
如果两个模型没有业务关联,只是需要按相同排序规则一一对应展示,修改app3/views.py的get_context_data方法:
def get_context_data(self, **kwargs): context = super(IndexView, self).get_context_data(**kwargs) # 保证Deployment的排序规则和AccountRecord完全一致 deployments = Deployment.objects.order_by("id").all() # 打包两个查询集 context['paired_list'] = zip(context['object_list'], deployments) return context
修改模板遍历逻辑:
{% for account, deployment in paired_list %} <tr> <td>{{ deployment.name }}</td> <td>{{ account.name }}</td> <td>{{ account.national_id }}</td> <td>{{ account.file_name }}</td> </tr> {% endfor %}
注意:该方案需保证两个查询集数量匹配、排序规则一致、分页逻辑同步,否则会出现数据错配
方案3:每行展示全量部署名称(适合需要在单条账户记录下展示所有部署的场景)
如果不需要一一对应,只是要在每个账户行展示所有部署的名称,直接修改模板遍历全量部署查询集即可:
<td> {% for dep in deployment %} {{ dep.name }}<br> {% endfor %} </td>
内容的提问来源于stack exchange,提问作者HyperactiveSloth
相关产品推荐
相关产品推荐

