【发布时间】:2014-08-20 09:18:00
【问题描述】:
我有一个带有Charfield 属性的模型(我们将其命名为advantages)和choices 属性。一段时间后,我决定应该将此字段“升级”为某种ListField,因为可以选择多个选项。
根据我的搜索,我有两个选择:
1 - 创建一个新模型,并在引用此新模型的第一个模型中使用 ManyToManyField。这样,将呈现 admin 中使用的“多选”默认字段。生活是美好的。
2- 创建一个自定义字段,将我的字段保存为带有某种分隔符的字符串。
What is the most efficent way to store a list in the Django models? 总结了这两种方法,更多示例中总结了第二种方法:How to create list field in django、http://cramer.io/2008/08/08/custom-fields-in-django/、https://djangosnippets.org/snippets/1200/、https://djangosnippets.org/snippets/1491/
事实是:我不想创建另一个模型只是为了拥有ManyToManyField。这是我拥有的选择的受控列表(并且不希望人们添加新项目)并认为为此创建一个表是多余的(尽管我可以为该表创建一个固定装置而不在 admin.py 中注册模型,所以人们不会添加新项目。但是我不知道在更改固定装置中的这些值时迁移将如何工作,而在过去我只是碰巧在我的模型定义中使用 choices 元组)。
...并创建一个新的自定义字段,我不知道。从长远来看,这似乎是个问题,因为我不知道其含义、升级 Django 时的问题等。
为什么没有内置ListField?从长远来看,我正在考虑的两种方法有哪些问题?我打算做第一个,但我对迁移有点迷茫。
【问题讨论】:
-
您的意思是
ListField(数组数据类型)吗?问题在于后端数据库 - Postgres 确实支持列表字段,但 mysql、sqlite 等不支持。django 的未来版本可能会包含更紧密支持 postgres 数据库的功能,所以这可能确实是现实. -
@karthikr 我现在这是因为后端不可知的功能。但是如果它是内置的,那么使用第二种方法的不是那么“快”
ListField会很好。它不一定需要是一个数组,但它看起来是,即使存在一些性能问题。 -
因为它会违反规范化并且永远不够大。
标签: django django-models django-admin django-migrations