Django元数据库的最佳实践是什么?

时间:2015-05-10 01:54:38

标签: python django database database-design metadata

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

现在,我有几个应用程序,它们之间的唯一区别是模型。甚至CRUD视图和URL也几乎相同。所以我想使用一些元数据库以统一的方式存储所有数据。就像在3个表中存储所有值一样 - 对于字符串,int和float。

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

另一方面,有一个选项,我无法动态编程创建新模型。一旦它投入生产 - 由于项目文件的校验和,代码中不应该有任何变化。

我需要一个如何处理这种情况的建议。我想到了像Drupal metadatabase这样的东西,但Drupal动态创建了新表,并且代码中不需要模型来使用它们。有没有办法在Django中这样做?

1 个答案:

答案 0 :(得分:0)

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

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']