2013-08-15 6 views
0

На этом были некоторые близкие, но все, что я могу найти, это то, что я делаю, и его не работает.django "- это связанное вручную отношение m2m через модель ..., которое не имеет внешних ключей к"

Ниже приведен пример: у вас есть продукт, который может иметь несколько вариантов. Каждый вариант может иметь несколько вариантов.

class Option_Choices(models.Model): 
    """ 
    choices for each option 
    """ 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return self.name 


class Product_Options(models.Model): 
    """ 
    products can have many options 
    """ 
    name = models.CharField(max_length=30) 
    option_type = models.IntegerField(choices=OPTION_TYPE) 
    choices = models.ManyToManyField(Option_Choices, related_name='product_options_choices') 

    def __unicode__(self): 
     return self.name 


class Product(models.Model): 
    """ 
    there are options for products - different sizes/colors 
    """ 
    name = models.CharField(max_length=30) 
    options = models.ManyToManyField(Product_Options, related_name='product_options') 

    def __unicode__(self): 
     return self.name 

Выглядит достаточно просто, я получаю эту ошибку

«опции» представляет собой вручную определенные M2M связь через модель Product_Options, который не имеет внешних ключей к Product_Options и продукт

Я пробовал много разных вещей, в том числе используя «сквозной», не могу понять, почему это не работает. это то, что все говорят. есть идеи?

ответ

3

Я обычно изменяю определения m2m, как показано ниже. В вашем коде выше вы видите конфликт в именах таблиц из-за подчеркивания в именах классов модели. Если вы удалите символы подчеркивания, он должен работать.

Реверсирование отношений может работать, если вы хотите сохранить символы подчеркивания.

class Option_Choices(models.Model): 
    """ 
    choices for each option 
    """ 
    name = models.CharField(max_length=30) 
    product_options = models.ManyToManyField("Product_Options", related_name='choices') 


class Product_Options(models.Model): 
    """ 
    products can have many options 
    """ 
    OPTION_TYPE=(
     ('Color', 1), 
    ) 
    name = models.CharField(max_length=30) 
    option_type = models.IntegerField(choices=OPTION_TYPE) 
    products = models.ManyToManyField("Product", related_name='options') 


class Product(models.Model): 
    """ 
    there are options for products - different sizes/colors 
    """ 
    name = models.CharField(max_length=30) 
+0

«Обратное» отношение M2M неверно. См. [Docs] (https://docs.djangoproject.com/en/dev/topics/db/models/) – hobs

+0

@hobs Не могли бы вы уточнить? – AndrewS

+0

Я неправильно понял, что вы имели в виду под «обратным». Я думал, что вы изменили направление отношений, поместив поля FK в противоположные таблицы, и я не прокрутил достаточно далеко вправо, чтобы убедиться, что вы не определили Option_Choices как явную «сквозную» модель. Нельзя помещать M2M в сквозной стол ... но вы этого не сделали, так что все в порядке. Это то, что я получаю для скимминга. – hobs