【问题标题】:What is the best practice on the metadatabase for Django?Django 元数据库的最佳实践是什么?
【发布时间】:2015-07-20 17:32:47
【问题描述】:

我必须开发一个用于存储数据的 Web 服务,并且我想在 Python/Django 上进行。它在前端只有 2 个元素 - 一个表格和一个图表。所以基本上模板中的输出对于所有应用程序中的所有视图都是完全标准的。我有 2 个类为 JSON 中这 2 个元素的输出编译数据,这些数据在前端发送到 ReactJS。

现在,我有几个应用程序,它们之间的唯一区别是模型。甚至 CRUD-views 和 URLS 对于它们来说几乎都是一样的。所以我正在考虑使用一些元数据库以统一的方式存储所有数据。就像将所有值存储在 3 个表中一样 - 用于字符串、int 和 float。

我害怕的是性能。如果我的所有元数据(如对象类型、类别等)都存储在一个表中,我想使用 Django ORM 和所有事物的通用模型从 4 或 5 个请求中获取一个简单的值将是地狱。系统。

另一方面,我不能以编程方式即时创建新模型。一旦投入生产 - 由于项目文件的校验和,代码中不应有任何更改。

我需要关于如何处理这种情况的建议。我想到了 Drupal 元数据库之类的东西,但是 Drupal 动态创建新表,并且它不需要代码中的模型来处理它们。有没有办法在 Django 中做到这一点?

【问题讨论】:

    标签: python django database database-design metadata


    【解决方案1】:

    根据您的要求,您可能需要使用通用关系:https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/,但如果所有元数据都保存在一个表中,这不会是世界末日。假设您有 3 个不同的模型字符串、整数、浮点数。您需要创建一个充当键值存储的元数据模型:

    class MetaData(models.Model):
        key = models.CharField(max_length=256, db_index=True)
        value = models.CharField(max_length=256)
    
        # Generic relationship to an arbitrary object
        content_type = models.ForeignKey(ContentType)
        object_id = models.PositiveIntegerField()
        content_object = generic.GenericForeignKey('content_type', 'object_id')
    

    然后在一个简单的情况下,您可以像这样使用将值保存到此表: f=Float.objects.get(pk=1) v = MetaData(content_object=f, key="float_calculation_precision", value="6") v.save()

    如果您事先知道您将只使用这 3 个模型,您可以在每个模型上添加一个反向 GenericRelation 字段。

    class Floats(models.Model):
        metadata = generic.GenericRelation(MetaData)
    
    class Ints(models.Model):
        metadata = generic.GenericRelation(MetaData)
    
    class Strings(models.Model):
        metadata = generic.GenericRelation(MetaData)
    

    然后您可以像这样访问他们的元数据:

    Floats.metadata.all()
    

    获取所有元数据对象或:

    f = Floats.objects.get(pk=1)
    
    f.metadata.all()
    

    获取特定对象的所有元数据对象:

    您也可以使用https://github.com/rafaelsierra/django-metadata 包,您可以在其中执行类似操作:

    mymodel.metadata['something'] = 'some value'
    mymodel.metadata['something']
    

    【讨论】:

    • 这很有趣,但你写的是关于实现的。知道我允许的模型后,我甚至可以使用带有简单模型和过滤器的 ORM 来制作 mdb(元数据库)。困扰我和我要问的实际上是 mdb 模式本身。一种使用 mdb 表以统一方式存储我可能需要的所有模型并存储/管理其数据的方法。以及您可能推荐的解决方案的性能。也许有关于这个主题的链接或书籍?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2016-04-06
    • 2011-11-23
    • 1970-01-01
    • 2018-07-17
    • 2011-12-03
    相关资源
    最近更新 更多