如何避免 django“与相关 m2m 字段冲突”错误?

Posted

技术标签:

【中文标题】如何避免 django“与相关 m2m 字段冲突”错误?【英文标题】:How to avoid django "***es with related m2m field" error? 【发布时间】:2011-07-30 16:53:16 【问题描述】:

我有很多具有投票功能的模型,所以我创建了一个这样的结构:

class Voteable(models.Model):
    likes_balance = models.IntegerField(default=0, editable=False)
    votes = models.ManyToManyField(User, blank=True, editable=False)
    likes = models.ManyToManyField(User, blank=True, editable=False)

    class Meta:
        abstract = True

class Item(Voteable):
    title = models.CharField(max_length=20, db_index=True)
    description = models.TextField(max_length=1000)
    contact_user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
        abstract = True

class Movie(Item):
    cover = models.ImageField(upload_to='images/covers/')

class Car(Item):
    seller = models.CharField(max_length=50)

当我尝试使用“python manage.py syncdb”创建表时,我收到错误消息:

m2m 字段“喜欢”的访问器与相关字段“User.movi​​e_set”发生冲突。在“likes”的定义中添加一个related_name 参数。

因为我在 Item 类中有更多字段,所以不想将它们全部复制到所有子类中,而只是像错误建议的那样设置 related_name。

有什么建议可以解决吗?

【问题讨论】:

【参考方案1】:

I found a solution in Django documention.

可以在抽象模型中这样写:related_name="%(app_label)s_%(class)s_related"

【讨论】:

【参考方案2】:

通常,如果您按照 M2M 定义中的建议添加相关名称,它应该可以工作:

class Voteable(models.Model):
    likes_balance = models.IntegerField(default=0, editable=False)
    votes = models.ManyToManyField(User, blank=True, editable=False, related_name='votes')
    likes = models.ManyToManyField(User, blank=True, editable=False, related_name='likes')

    class Meta:
        abstract = True

这是因为不这样做,Django 会在 Voteable 表中添加两个 user_id,导致冲突,因为有两次相同的列名。添加related_name 强制Django 使用给定的related_name 而不是Foreign Table Name_id 列名。

希望这会有所帮助。

【讨论】:

这没什么用,因为 Votable 类不打算单独使用 class Meta: abstract = True 。当我将related_name 添加到它们时, class Movie class Car 中会发生相同的错误

以上是关于如何避免 django“与相关 m2m 字段冲突”错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在django中复制数据,我该如何避免?

如何避免在 django 中选择 n+1?

如何避免 Django 中的导入时数据库访问?

如何避免使用 Django、nginx 和 uWSGI 将环境变量放到多个地方?

如何避免 django 权限字符串中的拼写错误

Django/Python DRY:使用 Q 对象和模型属性时如何避免重复代码