Django模型多选

问题描述 投票:37回答:4

我知道模型没有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)
    ...

但具有保存多个选择的能力不仅仅是一个选择。

python django django-models
4个回答
43
投票

您需要考虑如何在数据库级别存储数据。这将决定您的解决方案。

据推测,您希望表中存储多个值的单个列。这也会强迫您考虑如何序列化 - 例如,如果您需要存储可能包含逗号的字符串,则不能简单地用逗号分隔。

但是,您最好使用类似下列之一的解决方案:


35
投票

如果你使用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),
    )

8
投票

从这两个,https://pypi.python.org/pypi/django-select-multiple-field/看起来更圆润和完整。它甚至有一套很好的单元测试。

我发现的问题是它在实现模型字段的类中抛出了Django 1.10弃用警告。

我修好了这个并发了PR。最新的代码,直到他们合并我的PR(如果他们决定嘿嘿)是我的回购分支,在这里:https://github.com/matiasherranz/django-select-multiple-field

干杯!

M.-


0
投票

如果您希望窗口小部件看起来像文本输入,并且仍然能够从建议中选择多个选项,那么您可能正在寻找Select2。还有django-select2将它与Django Forms和Admin集成。

© www.soinside.com 2019 - 2024. All rights reserved.