如何在Django模型中存储任意数量的字段?

1 投票
2 回答
2064 浏览
提问于 2025-04-15 13:08

我刚开始学习python和django。我需要在django模型中存储任意数量的字段。我想知道django有没有什么方法可以处理这个问题。

通常,我会在一个列中存储一些XML来实现这个功能。django有没有提供一些类,让这个过程变得简单,无论是用XML还是其他(更好的)方法?

谢谢,
Pete

2 个回答

0

这里有一个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())字典列表放进去?

我对其他建议也很感兴趣。

11

解决这个问题的方法有很多,具体用哪种方法要看你的情况。你可以使用一个文本框来存储XML、JSON或其他任何形式的文本。结合Python的pickle功能,你可以做一些更方便的操作。

你可以看看DjangoSnippets上的Django Pickle Field定义:http://www.djangosnippets.org/snippets/513/

这个功能可以让你把Python字典放进字段里,并进行一些处理,这样当你引用这些字段时,就能轻松访问字典,而不需要重新解析XML或其他东西。

我想你也可以考虑写一个自定义字段定义,来实现类似的功能,支持其他序列化格式,不过我不太确定这样做有多大用处。

或者你可以简单地调整你的模型,利用多对多字段(ManyToMany)。你可以为一个通用的键值对创建一个模型,然后在你的主模型中引用这个通用的键值模型。这样,你就可以更好地利用Django的ORM来引用数据等等。

撰写回答