2012-05-30 2 views
0

У меня есть модель:Джанго: Удаление модели ссылаются как ManyToManyField

class picture(models.Model): 
    name = models.CharField(null=False, blank=False, max_length=128) 
    collections = models.ManyToManyField('collection', null=False, blank=False) 
    sizes = models.ManyToManyField('picture_size', null=False, blank=False) 
    papers = models.ManyToManyField('picture_paper', null=False, blank=False) 
    base_price = models.DecimalField(decimal_places=2, null=False, blank=False, default=2000, max_digits=10) 
    img_icon = models.FileField(blank=False, null=False, upload_to='pic_icons') 
    img_large = models.FileField(blank=False, null=False, upload_to='pic_large') 
    img_huge = models.FileField(blank=False, null=False, upload_to='pic_huge') 
    is_active = models.BooleanField(blank=False, null=False, default=True) 

и picture_paper:

class picture_paper(models.Model): 
    name = models.CharField(null=False, blank=False, max_length=128) 
    price_per_ssm = models.DecimalField(null=False, blank=False, decimal_places=2, max_digits=10) 
    is_active = models.BooleanField(null=False, blank=False, default=True) 

Я зарегистрировать их модели в админ и может создать picture_paper, но не может удалить его :

(1054, "Неизвестный столбец 'picture_paper_id' в 'где п'")

SQL, он строит это:

'DELETE FROM `core_picture_papers` WHERE `picture_paper_id` IN (%s)' 

объяснить core_picture_papers:

id int(11) NO PRI  auto_increment 
picture_id int(11) NO MUL  
paper_id int(11) NO MUL 

Является ли моя установка модель совершенно неправильно (я пытаюсь построить словарь видов бумаги и подключить их к изображениям - изображение может относиться к нескольким размерам или одному и т. д.)? Или что-то мне не хватает?

ответ

0

Я бы сказал, что вы пытаетесь удалить объект picture_paper, который связан с существующим объектом picture. Поскольку ваш M2M не может быть Null или Blank, вы получаете сообщение об ошибке, когда пытаетесь его удалить.

Взгляните на документацию Django о параметре on_delete. Вам, вероятно, нужно будет установить его как PROTECTED и правильно обработать исключения.

Смежные вопросы