如何在Django模型中存储任意数量的字段?
我刚开始学习python和django。我需要在django模型中存储任意数量的字段。我想知道django有没有什么方法可以处理这个问题。
通常,我会在一个列中存储一些XML来实现这个功能。django有没有提供一些类,让这个过程变得简单,无论是用XML还是其他(更好的)方法?
谢谢,
Pete
2 个回答
这里有一个XML字段可以用:
http://docs.djangoproject.com/en/dev/ref/models/fields/#xmlfield
不过,这样做会让你在查询结果上做额外的解析工作。
(我觉得你可能还是得做一些解析……)
我考虑过把一个列表,unicode(mycolumnlist),放进一个字符字段里,然后再加上几个固定数量的索引字符字段,像这样:
class DumbFlexModel(models.Model):
available_fields = models.CharField()
field1 = models.CharField()
field2 = models.CharField()
field3 = models.CharField()
...
这样的话,你至少可以在available_fields上进行包含查询,筛选出只有你想要的字段的结果。但是,位置是随机的,所以你还是得逐个查看结果,处理available_fields来找到值的位置。
或者,也许可以把一个序列化的(pickle.dumps())字典列表放进去?
我对其他建议也很感兴趣。
解决这个问题的方法有很多,具体用哪种方法要看你的情况。你可以使用一个文本框来存储XML、JSON或其他任何形式的文本。结合Python的pickle功能,你可以做一些更方便的操作。
你可以看看DjangoSnippets上的Django Pickle Field定义:http://www.djangosnippets.org/snippets/513/
这个功能可以让你把Python字典放进字段里,并进行一些处理,这样当你引用这些字段时,就能轻松访问字典,而不需要重新解析XML或其他东西。
我想你也可以考虑写一个自定义字段定义,来实现类似的功能,支持其他序列化格式,不过我不太确定这样做有多大用处。
或者你可以简单地调整你的模型,利用多对多字段(ManyToMany)。你可以为一个通用的键值对创建一个模型,然后在你的主模型中引用这个通用的键值模型。这样,你就可以更好地利用Django的ORM来引用数据等等。