直接在模型中存储django forms.MultipleChoiceField

Lak*_*sad 3 python django django-models django-forms

假设我的选择定义如下:

choices = (('1','a'),
           ('2','b'),
           ('3','c'))
Run Code Online (Sandbox Code Playgroud)

以及在MultipleChoiceField中呈现和输入这些值的表单,

class Form1(forms.Form):
    field = forms.MultipleChoiceField(choices=choices)
Run Code Online (Sandbox Code Playgroud)

什么是存储field在模型中的正确方法.

我当然可以遍历forms.cleaned_data['field']并获得适合的值models.CommaSeperatedIntegerField.

同样,每次我检索这些值时,我都必须循环并转换为选项.

我认为有更好的方法可以做到这一点,就像这样,我在某种程度上重新实现了CommaSeperateIntegerField应该做的功能.

Car*_*yer 11

我要考虑的第一件事是更好地规范化数据库模式; 如果模型的单个实例可以具有此字段的多个值,则该字段可能应该是具有ForeignKey的链接模型.

如果你正在使用Postgres,你也可以使用ARRAY字段; Django现在有内置的支持.

如果你不能做其中任何一个,那么你基本上需要重新实现一个(更好的)CommaSeparatedIntegerField版本.原因是CommaSeparatedIntegerField只是一个普通的CharField,它的默认表单字段表示是一个正则表达式验证的文本输入.换句话说,它没有做任何对你有用的事情.

您需要编写的是自定义ListField或MultipleValuesField,它需要Python列表并返回Python列表,但在内部将该列表转换为逗号分隔的字符串,以便插入数据库中.阅读有关自定义模型字段文档 ; 我认为在你的情况下,你需要一个CharField的子类,它有两个方法被覆盖:to_python(将CSV字符串转换为Python列表)和get_db_prep_value(将Python列表转换为CSV字符串).