Django - Django ORM 如何管理用户在数据库中上传的表

Posted

技术标签:

【中文标题】Django - Django ORM 如何管理用户在数据库中上传的表【英文标题】:Django - How can Django ORM manage user's uploaded tables in database 【发布时间】:2013-04-05 18:01:10 【问题描述】:

我的 Web 应用程序允许用户在 Postgres 数据库中加载/创建表。我知道 Django ORM 需要在 models.py 中为数据库中的每个表定义模型才能访问它。如何在每次上传新表时访问用户在应用程序中上传的表,而无需即时创建新的模型定义?我正在考虑创建一个通用模型定义,将表分解为其组件,如下所示:

模型.py

class Table(models.Model):
    filename = models.CharField(max_length=255)

class Attribute(models.Model):
    table = models.ForeignKey(Table)
    name = models.CharField(max_length=255)
    type = models.IntegerField()
    width = models.IntegerField()
    precision = models.IntegerField()

class Row(models.Model):
    table = models.ForeignKey(Table)

class AttributeValue(models.Model):
    row = models.ForeignKey(Row)
    attribute = models.ForeignKey(Attribute)
    value = models.CharField(max_length=255, blank=True, null=True)

这样一个通用模型的问题是每个表都混合在 4 个表中(在管理界面中没有用),当你有很多行时创建它真的很慢。您对这个案例有什么建议吗?

编辑: 每次用户添加或删除表时,使用单独的数据库存储这些表并使用路由器和manage.py inspectdb 更新其models.py 是否可行? (like in this post) 不知道如果两个用户同时添加一个表会怎样?

【问题讨论】:

我不明白您的主要问题是如何让用户创建他的表,或者您如何定义模型来处理用户正在创建的表。 主要问题是如何使用 Django ORM 处理表。我正在考虑在上传(或删除)后调用 inspectdb,但我不确定它是否是最好的解决方案。 【参考方案1】:

我认为您应该像这里一样研究动态模型:

https://code.djangoproject.com/wiki/DynamicModels

或这里:

http://dynamic-models.readthedocs.org/en/latest/

祝你好运,因为这不是一个简单的方法,我的朋友 :)

【讨论】:

【参考方案2】:

您可能需要使用 raw SQL queries 来执行此操作。

如果您期望的表架构是预定义的,您可以使用数据库路由器将某个模型链接到每个用户的特定表名。

【讨论】:

以上是关于Django - Django ORM 如何管理用户在数据库中上传的表的主要内容,如果未能解决你的问题,请参考以下文章

django orm 管理器 objects

如何在django系统外使用django的ORM

如何在django系统外使用django的ORM

python Django ORM ,用filter方法表示“不等于”

django_ORM学生管理系统

Web框架之Django_02基本操作(Django项目启动配置数据库连接orm增删改查)