为啥 Django 中没有“ListField”?
Posted
技术标签:
【中文标题】为啥 Django 中没有“ListField”?【英文标题】:Why there isn't a "ListField" in Django?为什么 Django 中没有“ListField”? 【发布时间】: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
会很好。它不一定需要是一个数组,但它看起来是,即使存在一些性能问题。
因为它会违反规范化并且永远不够大。
【参考方案1】:
django.contrib.postgres has an ArrayField.
【讨论】:
【参考方案2】:您似乎不愿意创建一个仅包含列表的新表(因为这将是“矫枉过正”),但您的建议是在 all 中复制/粘贴相同的确切值strong> 表的条目,我认为这不是一个好的模型解决方案。
我建议使用 ManyToMany(或任何其他实现与另一个表的技巧)。
【讨论】:
以上是关于为啥 Django 中没有“ListField”?的主要内容,如果未能解决你的问题,请参考以下文章
Django rest framework 之 DictField、ListField、自定义字段
Blackberry ListField Text Wrapping - 只有两行
BlackBerry 在 TreeField 或 ListField 中的水平滚动