Django模型多选
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django模型多选相关的知识,希望对你有一定的参考价值。
我知道模型没有MultipleChoiceField
,你只能在Forms上使用它。
今天,在分析与多项选择相关的新项目时,我遇到了一个问题。
我希望像CharField
这样的领域有choices
,可以选择多种选择。
我通过创建一个CharField
解决了这个问题,并使用forms.MultipleChoiceField
管理表单中的多个选项并存储用逗号分隔的选项。
在这个项目中,由于配置的原因,我不能像上面提到的那样做,我需要在模型中进行,我不想编辑Django管理表单,也不使用表单。我需要一个具有多个选项的模型字段选项
- 有人通过模特解决了这样的事吗?
也许覆盖一些模型功能或使用自定义小部件......我不知道,我有点迷失在这里。
Edit
我知道简单的选择,我希望有类似的东西:
class MODEL(models.Model):
MY_CHOICES = (
('a', 'Hola'),
('b', 'Hello'),
('c', 'Bonjour'),
('d', 'Boas'),
)
...
...
my_field = models.CharField(max_length=1, choices=MY_CHOICES)
...
但具有保存多个选择的能力不仅仅是一个选择。
您需要考虑如何在数据库级别存储数据。这将决定您的解决方案。
据推测,您希望表中存储多个值的单个列。这也会强迫您考虑如何序列化 - 例如,如果您需要存储可能包含逗号的字符串,则不能简单地用逗号分隔。
但是,您最好使用类似下列之一的解决方案:
- https://pypi.org/project/django-multiselectfield/
- https://pypi.org/project/django-select-multiple-field/
如果你使用Postgres考虑使用ArrayField。
from django.db import models
from django.contrib.postgres.fields import ArrayField
class WhateverModel(models.Model):
WHATEVER_CHOICE = u'1'
SAMPLE_CHOICES = (
(WHATEVER_CHOICE, u'one'),
)
choices = ArrayField(
models.CharField(choices=SAMPLE_CHOICES, max_length=2, blank=True, default=WHATEVER_CHOICE),
)
从这两个,https://pypi.python.org/pypi/django-select-multiple-field/看起来更圆润和完整。它甚至有一套很好的单元测试。
我发现的问题是它在实现模型字段的类中抛出了Django 1.10弃用警告。
我修好了这个并发了PR。最新的代码,直到他们合并我的PR(如果他们决定嘿嘿)是我的回购分支,在这里:https://github.com/matiasherranz/django-select-multiple-field
干杯!
M.-
如果您希望窗口小部件看起来像文本输入,并且仍然能够从建议中选择多个选项,那么您可能正在寻找Select2。还有django-select2将它与Django Forms和Admin集成。
以上是关于Django模型多选的主要内容,如果未能解决你的问题,请参考以下文章