Django有很多选择

Django有很多选择,django,django-models,Django,Django Models,我正在尝试设置一个多重选择来选择 type = models.CharField(max_length=20, choices=TYPE_CHOICES) 以上是我目前正在做的事情,但它只让我选择“TYPE_CHOICES”中的一项。我希望能够在“TYPE_CHOCIES”中选择多个项目 我可以通过使用多个关系和选择一个模型来做到这一点,但我更喜欢保持简单 我尝试过搜索,但没有找到任何东西,或者这是否可行?您可以尝试使用。不过,最终您将不得不自己进行验证 from django.contrib

我正在尝试设置一个多重选择来选择

type = models.CharField(max_length=20, choices=TYPE_CHOICES)
以上是我目前正在做的事情,但它只让我选择“TYPE_CHOICES”中的一项。我希望能够在“TYPE_CHOCIES”中选择多个项目

我可以通过使用多个关系和选择一个模型来做到这一点,但我更喜欢保持简单

我尝试过搜索,但没有找到任何东西,或者这是否可行?

您可以尝试使用。不过,最终您将不得不自己进行验证

from django.contrib.postgres.fields import ArrayField

class YourModel(models.Model):
    types = ArrayField(
        models.CharField(max_length=20, choices=TYPE_CHOICES),
        size=2,
    )
你可以试着用一种新的方法。不过,最终您将不得不自己进行验证

from django.contrib.postgres.fields import ArrayField

class YourModel(models.Model):
    types = ArrayField(
        models.CharField(max_length=20, choices=TYPE_CHOICES),
        size=2,
    )

您在设计中遇到了所谓的“数据库规范化”

后退一步,如果你可以选择“红色”和“蓝色”作为一个项目的有效颜色,考虑数据会是什么样子……/P> 数据库单元格需要是“红色,蓝色”或类似的“红色|蓝色”,无论您选择什么分隔符。但是,你会如何查询所有带有“蓝色”的东西呢?您不能这样做,因为

select*from table where color='blue'
不起作用。这就是@Willem Van Onsem回复您需要一个外部表的原因。这是一个典型的解决方案,当你需要多种选择时,你可以在Django文档中看到,在那里他们讨论比萨饼的配料


class Topping(models.Model):
    name = models.CharField(max_length=30)

class Pizza(models.Model):
    name = models.CharField(max_length=50)
    toppings = models.ManyToManyField(Topping)

    def __str__(self):
        return "%s (%s)" % (
            self.name,
            ", ".join(topping.name for topping in self.toppings.all()),
        )

您将无法在此使用
选项
解决方案。这不太合适。您可以使用Toppings或Color表中的文本填写表单选项。

您在设计中遇到了所谓的“数据库规范化”

后退一步,如果你可以选择“红色”和“蓝色”作为一个项目的有效颜色,考虑数据会是什么样子……/P> 数据库单元格需要是“红色,蓝色”或类似的“红色|蓝色”,无论您选择什么分隔符。但是,你会如何查询所有带有“蓝色”的东西呢?您不能这样做,因为

select*from table where color='blue'
不起作用。这就是@Willem Van Onsem回复您需要一个外部表的原因。这是一个典型的解决方案,当你需要多种选择时,你可以在Django文档中看到,在那里他们讨论比萨饼的配料


class Topping(models.Model):
    name = models.CharField(max_length=30)

class Pizza(models.Model):
    name = models.CharField(max_length=50)
    toppings = models.ManyToManyField(Topping)

    def __str__(self):
        return "%s (%s)" % (
            self.name,
            ", ".join(topping.name for topping in self.toppings.all()),
        )

您将无法在此使用
选项
解决方案。这不太合适。您可以使用Toppings或Color table中的文本填写表单选项。

是的,这是可能的,您只需为
选项创建一个模型,然后添加一个域
名称
。是的,我知道我可以这样做。这是唯一的办法吗?我只是不想那样做。但是如果这是唯一的方法,那么我会这样做。是的,这是可能的,你只需为
选择
制作一个模型,然后添加一个域
名称
。是的,我知道我可以这样做。这是唯一的办法吗?我只是不想那样做。但如果这是唯一的办法,那么我会去做。