0

在这方面有一些亲密的人,但我能找到的只是我正在做的事情,但它不起作用。

这是一个示例:您的产品可以有多个选项。每个选项可以有多个选择。

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' 是通过模型 Product_Options 手动定义的 m2m 关系,它没有 Product_Options 和 Product 的外键

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

4

1 回答 1

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)
于 2013-08-15T04:45:31.657 回答