我必须开发一个用于存储数据的web服务,我想在Python / Django上进行。它在前端只有2个元素 - 一个表和一个图表。所以基本上模板中的输出完全是所有应用程序中所有视图的标准。我有2个类为JSON中的这2个元素的输出编译数据,前端是ReactJS。
现在,我有几个应用程序,它们之间的唯一区别是模型。甚至CRUD视图和URL也几乎相同。所以我想使用一些元数据库以统一的方式存储所有数据。就像在3个表中存储所有值一样 - 对于字符串,int和float。
我害怕的是表现。如果我的所有元数据(如对象类型,类别等)都将存储在一个表中,我想使用Django ORM以及所有事物的通用模型来获取4或5个请求中的简单值将是完美的。系统。
另一方面,有一个选项,我无法动态编程创建新模型。一旦它投入生产 - 由于项目文件的校验和,代码中不应该有任何变化。
我需要一个如何处理这种情况的建议。我想到了像Drupal metadatabase这样的东西,但Drupal动态创建了新表,并且代码中不需要模型来使用它们。有没有办法在Django中这样做?
答案 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']