我有很多具有投票功能的模型,所以我创建了一个这样的结构:
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.movie_set'的冲突。将related_name参数添加到“likes”的定义中。
原因我在Item类中有更多字段,所以不要将它们全部复制到所有子类,只需设置像错误建议的related_name。
有任何建议如何处理吗?
答案 0 :(得分:10)
I found a solution in Django documention
可以在抽象模型中编写如下内容:related_name="%(app_label)s_%(class)s_related"
答案 1 :(得分:2)
通常,如果您按照M2M定义中的建议添加related_name,它应该有效:
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列名。
希望这有帮助。