2015-05-10 65 views
0

我必须开发一个用于存储数据的web服务,我想在Python/Django上完成。它在前端只有两个元素 - 一个表格和一个图表。所以基本上,模板中的输出对于所有应用程序中的所有视图都是完全标准的。我有两个类为JSON中的这两个元素的输出编译数据,然后在前端使用ReactJS。Django元数据库的最佳做法是什么?

现在,我有几个应用程序,它们之间的唯一区别是模型。即使CRUD视图和URL也几乎相同。所以我正在考虑使用一些元数据库来统一存储所有数据。就像将所有值存储在3个表中一样 - 用于字符串,整型和浮点型。

我害怕的是性能。如果我的所有元数据(如类型的对象,类别等)都存储在一个表中,我想用Django ORM和一个通用模型来处理4或5个请求中的一个简单值是非常困难的。系统。

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

我需要一个建议如何处理这种情况。我想到了类似于Drupal的元数据库,但Drupal即时创建了新表,并且它不需要代码中的模型来处理它们。有没有办法在Django中这样做?

回答

0

从您的要求来判断,您可能需要使用通用关系: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 =元数据(content_object = F,关键= “float_calculation_precision”,值= “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'] 
+0

这是非常有趣的,但你写了关于实现。知道我允许的模型,我甚至可以使用带有简单模型和过滤器的ORM来创建mdb(元数据库)。什么困扰我,我所要求的实际上是一个mdb模式本身。一种使用mdb表格统一存储我可能需要的所有模型以及存储/管理其数据的方法。以及您可能会推荐的解决方案的性能。也许有关于这个主题的任何链接或书籍? – Tosh

相关问题