【问题标题】:Django: how do i create a model dynamicallyDjango:我如何动态创建模型
【发布时间】:2018-01-16 05:25:45
【问题描述】:

如何在上传 csv 文件时动态创建模型?我已经完成了它可以读取 csv 文件的部分。

【问题讨论】:

  • 为什么需要这样的东西?请详细说明,信息很短,无法知道确切的要求。
  • 我正在尝试创建一个 Web 应用程序,不同类型的用户可以在其中上传自己的 csv 文件以进行异常检测。然后根据用户上传的csv文件塑造模型
  • 然后使用 NoSQL、MongoDB 等。这样会很有用。

标签: django csv django-models


【解决方案1】:

This doc 很好地解释了如何在 django 运行时动态创建模型。它还链接到这样做的示例。

但是,正如您在查看文档后会看到的那样,这样做非常复杂和麻烦。我不建议这样做,并且相信您很有可能提前确定一个足够灵活以处理 CSV 的模型。这将是更好的做法,因为在您的应用程序运行时动态更改数据库的架构会导致代码中出现大量错误。

【讨论】:

    【解决方案2】:

    我了解到您希望根据 CSV 中的字段动态创建新架构。虽然那是一个有效的用例,并且可能是绝对正确的选择。不过我对此表示怀疑——它适用于单个 Tenet SaaS 应用程序的数据模型,该应用程序可能具有愚蠢的性能和迁移问题。

    我会尝试使用其他人提到的 Mongo/其他一些 NoSQL 解决方案。但更简单的方法可能是用 SQL 实现的修改后的 Star Schema。在这种情况下,您创建一个存储每个标题的维度表,然后创建每个数据元素的实例,该实例具有维度的外键并记录该维度的值。

    如果您阅读 csv,伪代码将如下所示:

    for row in DictReader(file):
       for k in row.keys():
           try:
              dim = Dimension.objects.get(name=k)
           except:
              dim = Dimension(name=k)
              dim.save()
           DimensionRecord(dimension=dim, value=row[k]
    

    显然,如果维度已经存在,您可以更好地处理读取标题和错误捕获,但这将是您如何将可变标题 CSV 动态加载到 SQL 数据库中的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-22
      • 2013-01-03
      • 2010-10-04
      • 2020-01-05
      • 2012-08-21
      • 2021-09-24
      • 2021-05-19
      • 2023-01-31
      相关资源
      最近更新 更多