使用Django将Python集合存储到数据库中

8

我需要将一个Python set存储在数据库中以供以后访问。最好的方法是什么?我的初始计划是在我的模型上使用textfield,只需将set存储为逗号或管道分隔的字符串,然后当我需要将其取出以在我的应用程序中使用时,可以通过调用split函数来初始化一个set。显然,如果有一种简单的方法可以序列化set以将其存储在数据库中,这样我以后需要使用时就可以将其作为set取回,那就最好不过了。


喜欢你的问题。很想看看专业的Python程序员有什么说法。 - Pablo Santa Cruz
你尝试持久化Python集合的原因是什么?为什么不在数据库中使用外键关系并设置正确的约束条件来确保项目的唯一性呢? - dfb
4个回答

4

pickle.dumps()pickle.loads() 操作的是字符串(这就是 "s" 的含义),因此它们也可以存储在 varchar 或其他文本列中。 - dcrosta

2
这里有许多选项,具体取决于您希望在集合中存储哪种数据。
如果是普通整数,CommaSeparatedIntegerField 可能可以很好地工作,尽管它经常让我感觉笨拙。
如果是其他类型的Python对象,您可以在保存到数据库之前尝试将其 pickling,并在重新加载时进行反序列化。这似乎是一个不错的方法。
如果您想要在数据库中获得人类可读的内容,则甚至可以将其 JSON编码 成TextField,只要您存储的数据不包括Python对象。

1
我认为CommaSeparatedIntegerField非常适合将MultipleChoiceField的值保存到数据库中。 - Ski

1

Redis本地存储集合(以及其他数据结构(列表、字典、队列)),并提供集合操作 - 而且速度非常快。我发现它是Python开发的瑞士军刀。

我知道它不是一个关系型数据库,但它确实非常简洁地解决了这个问题。


0

关于 CommaSeparatedIntegerField 呢?

如果你需要其他类型(例如字符串),你可以创建自己的字段,它将像 CommaSeparatedIntegerField 一样工作,但会使用字符串(而不是逗号)。

或者,如果你需要其他类型,可能更好的方法是:创建一个字典,将整数映射到你的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接