首页 > 解决方案 > 如何为每个模型条目(Django)存储和呈现 Pandas 数据帧/CSV?

问题描述

我有一个代表单个患者的模型。它存储诸如patient_name( CharField)、weight( IntegerField)、height( IntegerField) 等信息。

我扩展了 save 方法save(self, *args, **kwargs)以执行一系列计算/功能(例如计算 BMI)以保存回模型。对于扩展save()方法,它还运行一个函数,计算 pandas 中的每周减肥目标并保存到文件夹patient_name中的 CSV(以 命名) 。media

我正在尝试找出为每位患者显示该 CSV 数据的最佳方式。目前,我正在使用DetailViewCBV 为每位患者提供一个包含新计算模型字段的详细信息页面(例如<p>{{ object.patient_name }}'s calculated BMI is {{ object.bmi }}</p>

我有三个想法,但我不确定它们是否可行或如何实施。

1 - 我可以生成一个 HTML 表格而不是 CSV,有没有办法根据模型或主键 id 的特征从媒体文件夹呈现自定义 HTML 片段{% media|object.patient_name %}

2 - 我可以尝试将 pd.DataFrame、CSV(或 HTML 表的字符串文本表示)保存到新的模型字段(隐藏/可编辑 = False)并通过模板传递它,例如{{ object.html_table }}. 我只是不确定从 TextField 存储和呈现 HTML 代码是否可能或安全。

3 - 我可以尝试将 CSV/df 保存为图像ImageField并提供图像。理想情况下,会有一个像ImageField这样的模型字段将 1:1 引用到 CSV 文件(或 HTML 表表示)并允许 Django 模板传递并呈现它。

如果有人在过去尝试过类似的事情或知道为每个模型条目/数据库行实现存储和呈现表的最佳方法,将不胜感激。

标签: djangopandasdjango-modelsdjango-templates

解决方案


我不确定这是否是最安全的方式,它看起来有点笨拙,但它确实有效。我基本上采用了#2方法

在我的后端逻辑中,我刚刚获得了数据框的表格表示形式的 HTML 字符串,html_table_str = df.to_html()然后将字符串返回给我的模型html_table_str

我的后端逻辑.py:

def calculate_table(weight_kg, height_m):
    multiplier_df = pd.read_csv(MEDIA_ROOT + '\multipliers.csv')
    bmi = (weight_kg / (height_m ** 2)
    total_df = (multiplier_df * bmi)
    html_table_str = total_df.to_html()
    return html_table_str

模型.py:

from django.db import models
from .mybackendlogic import calculate_table

class DoFoo(models.Model):
    weight = models.IntegerField()
    height = models.IntegerField()
    html_table_str = models.TextField(editable=False)  # hidden in views

def save(self, *args, **kwargs):
    self.html_table_str = calculate_table(self.weight, self.height)
    super(DoFoo, self).save(*args, **kwargs)

然后通过{{ object.html_table_str|safe }}你的html模板

详细信息.html:

{% block content %}
<p class="">Here is your table, user </p>
{{ object.html_table_str|safe }}
{% endblock %}

推荐阅读