Джанго проблемы множественного выбора модели - PullRequest
4 голосов
/ 04 марта 2011

У меня две разные проблемы с множественным выбором в моделях.

Во-первых, я пытаюсь сделать множественный выбор, чтобы пользователь мог выбрать один или несколько дней недели:

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:

Ошибка: одна или несколько моделей не validate: situ.situ: у "day" есть m2m связь с модельным днем, которая имеет либо не был установлен, либо аннотация.
situ.situ: тип имеет отношение m2m с моделью категории, которая имеет не был установлен или является абстрактным.

Ответы [ 3 ]

5 голосов
/ 13 апреля 2011

вы можете использовать:

day = forms.ModelMultipleChoiceField(queryset=Day.objects.all())
4 голосов
/ 04 марта 2011

К сожалению, отношение ManyToMany работает только для отношений с другими моделями, а не для значений из набора вариантов. Django не предоставляет встроенный тип поля модели с множественным выбором. Однако в прошлом я использовал этот фрагмент при использовании поля множественного выбора: http://www.djangosnippets.org/snippets/1200/

Это кодирует несколько выбранных опций в список через запятую, хранящийся в CharField, который прекрасно работает, если только вам не нужно делать какое-то соединение или что-то еще в выборках. Если вам нужно сделать это, вам нужно будет определить новую модель Дня, в которой вы сможете использовать ManyToManyField.

Вторая проблема, я считаю, является результатом первой - если вы решите эту проблему, все будет в порядке.

2 голосов
/ 04 марта 2011

За первую часть ваших вопросов. Вы должны использовать 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)

Если модель Category была определена позже в том же приложении в models.py, вы можете оставить ее Category, но, поскольку она есть в другом приложении, вам необходимо указать имя приложения.

...