为啥 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 中的水平滚动

如何在 BlackBerry 中自定义 ListField?

如何在BlackBerry中自定义ListField?

Blackberry - 如何实现ListField Smooth Scrolling?