2013-06-24 10 views
1

У меня были следующие (релевантные) модели. поставки - это много-много поле.Сохранение поля m2m в Django Admin с ошибкой «ValueError: должно иметь значение до того, как это отношение« многие ко многим »можно использовать»

class Supplies(models.Model): 
    id = models.IntegerField(primary_key=True, editable=False) 
    name_html = models.CharField(max_length=100L) 
    name_verbose = models.CharField(max_length=150L) 
    class Meta: 
     db_table = u'supplies' 
    def __unicode__(self): 
     return self.name_html 

class Manufacturer(models.Model): 
    id = models.IntegerField(primary_key=True, editable=False) 
    name = models.CharField(max_length=135) 
    country = models.ForeignKey(Country) 
    supplies = models.ManyToManyField(Supplies, blank=True) 
    class Meta: 
     db_table = u'manufacturer' 
    def __unicode__(self): 
     return self.name 
     return self.country 

Посредник стол:

CREATE TABLE IF NOT EXISTS `manufacturer_supplies` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `manufacturer_id` int(11) NOT NULL, 
    `supplies_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `manufacturer_id` (`manufacturer_id`), 
    KEY `supplies_id` (`supplies_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=174 ; 
ALTER TABLE `manufacturer_supplies` 
    ADD CONSTRAINT `manufacturer_supplies_ibfk_3` FOREIGN KEY (`supplies_id`) REFERENCES `supplies` (`id`), 
    ADD CONSTRAINT `manufacturer_supplies_ibfk_2` FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturer` (`id`); 

Целые вещи проявляется совершенно в Django администратора с filter_horizontal. Но когда я пытаюсь сохранить новый «Изготовитель», я получаю: ValueError: "<Manufacturer: thisIsTheManufacturerName>" needs to have a value for field "manufacturer" before this many-to-many relationship can be used.

Я полагаю, что «изготовителем» является поле manufacturer_id из таблицы посредников. Я довольно потерял ...

История Когда я разработал свою схему базы данных, я не знал, что Django может справиться сам m2m отношения. Итак, я начинаю с модели m2m, определенной с through. У меня такая же ошибка. Поэтому я удалил свою модель, таблицу DB и запустил manage.py syncdb. Затем Django создал таблицу посредников. Поскольку я снова переключился, я разместил таблицу промежуточных таблиц, чтобы исключить ошибки.

+0

что такое, что пользовательские SQL? Это твое? Если да, то где вы видели, что нужно что-то подобное? Вы читали даже мельчайшие детали документации django? – rantanplan

+1

Я добавил примечание, почему я добавил макет БД. Я прочитал 1.5 документацию о m2m, среди многих других сообщений на форуме, в блогах и вопросах переполнения стека. – weeheavy

+1

Попробуйте удалить всю базу данных 'syncdb' и повторите попытку. – rantanplan

ответ

0

сама проблема не решена, но причина, почему она не теперь ясно мне:

В admin.py, я показываю поле с list_display (который я, к сожалению, не говоря уже здесь, потому что Я думал, что это было связано) - но docs сказать :

ManyToManyField fields aren’t supported, because that would entail executing a separate SQL statement for each row in the table. If you want to do this nonetheless, give your model a custom method, and add that method’s name to list_display. (See below for more on custom methods in list_display.)