django“是一个手动定义的m2m关系,通过模型...没有外键”

时间:2013-08-15 04:05:05

标签: django python-3.x 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

看起来很简单,我收到此错误

  

'options'是通过模型手动定义的m2m关系   Product_Options,没有Product_Options的外键   和产品

我尝试了很多不同的东西,包括使用“通过”无法弄清楚为什么这不起作用。这是每个人都说要做的事情。任何想法?

1 个答案:

答案 0 :(得分: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)