2011-04-06 64 views
3

我有很多的具有投票功能的機型,所以我創造了這樣的結構:如何避免django「與相關m2m字段衝突」錯誤?

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) 

當我嘗試用「蟒蛇manage.py執行syncdb」創建表,收到錯誤消息:

m2m字段「喜歡」的訪問者與相關字段「User.movi​​e_set」發生衝突。爲'likes'的定義添加一個related_name參數。

因爲我在Item類中有更多的字段,所以不想將它們全部複製到所有的子類中,只是像設置錯誤一樣設置related_name。

有什麼建議如何處理它?

回答

2

一般來說,如果你添加一個related_name在你的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列名稱。

希望這會有所幫助。

+0

這不是真的有用,因爲可投票類不是計劃本身class Meta: abstract = True使用。當我將相關名稱添加到它們兩個時,在class Movieclass Car中發生相同的錯誤 – luckyjazzbo 2011-04-06 10:35:50