django多项选择模型问题

时间:2011-03-03 23:01:32

标签: django django-models multiple-choice

我在模型中有多种选择存在两个不同的问题。

首先,我正在尝试进行多项选择,以便用户可以选择一周中的一天或多天:

DAYS_CHOICES = (
    (1, _('Monday')),
    ...
    (7, _('Sunday')),
)
...
day = models.ManyToManyField('day', choices=DAYS_CHOICES)

第二个问题:

我想在其他模型中使用模型定义创建ManyToMany关系: 首先(导入模型):

from events.models import Category

第二个(与模型相关的字段):

type = models.ManyToManyField('Category', null=True, blank=True)

我在syncdb上收到此错误:

  

错误:一个或多个模型没有   验证:situ.situ:'day'有一个m2m   与模型日的关系,具有   要么没有安装,要么是   抽象。
  situ.situ:'type'有m2m关系   与模型类别,其中任何一个   没有安装或是抽象的。

3 个答案:

答案 0 :(得分:5)

你可以使用:

day = forms.ModelMultipleChoiceField(queryset=Day.objects.all())

答案 1 :(得分:4)

不幸的是,ManyToMany关系仅适用于与其他模型的关系,而不适用于选择集中的值。 Django没有提供内置的多选模型字段类型。但是,我在过去使用多个选择字段时使用了此代码段:http://www.djangosnippets.org/snippets/1200/

这会将多个选定的选项编码为存储在CharField中的逗号分隔列表,除非您需要对选择进行某种连接或某些操作,否则该选项很有效。如果您需要这样做,则必须定义一个可以使用ManyToManyField的新Day模型。

第二个问题,我相信,只是第一个问题的结果 - 如果你澄清了这个问题,你就没问题了。

答案 2 :(得分:2)

问题的第一部分。您应该使用MultipleChoiceField

DAYS_CHOICES = (
    (1, _('Monday')),
    ...
    (7, _('Sunday')),
)
...
days = forms.MultipleChoiceField(choices=DAYS_CHOICES)

http://docs.djangoproject.com/en/dev/ref/forms/fields/#multiplechoicefield

这将产生一个Unicode对象列表。

对于第二个问题,您需要在m2m字段的模型的抽象声明中包含应用程序名称,或者不要抽象地声明它。

type = models.ManyToManyField(Category, null=True, blank=True)

type = models.ManyToManyField('events.Category', null=True, blank=True)

如果稍后在models.py中的同一个应用中定义了Category模型,则可以将其保留为Category,但由于它位于另一个应用中,因此您需要指定应用名称。