2016-11-25 38 views
0

在數據庫中,我已經註冊了4個人,但是當模型還沒有關係屬性時他們被註冊了。當我加入他們,我得到了這個模型:在Django用戶模型中遷移時Django UNIQUE約束失敗OneToOneField

class Person(User): 
    type = models.BooleanField() 
    avatar = models.ImageField(blank=True) 
    second_name = models.CharField(max_length=30, blank=True, default='') 
    birthday = models.DateField(blank=True, default=None) 
    country = models.CharField(max_length=30, blank=True, default='') 
    city = models.CharField(max_length=30, blank=True, default='') 
    school = models.CharField(max_length=60, blank=True, default='') 
    university = models.CharField(max_length=60, blank=True, default='') 
    work_place = models.CharField(max_length=60, blank=True, default='') 
    profession = models.CharField(max_length=60, blank=True, default='') 
    phone = models.CharField(max_length=30, blank=True, default='') 
    about = models.TextField(blank=True, default='') 
    latitude = models.FloatField(blank=True, default=-1) 
    longitude = models.FloatField(blank=True, default=-1) 

    friends = models.ForeignKey(
     'self', 
     related_name='+', 
    ) 

    black_list = models.ForeignKey(
     'self', 
     related_name='+', 
    ) 

    dialogues = models.ManyToManyField(
     'dialogues.Dialogue', 
    ) 

    news = models.OneToOneField(
     'news.NewsList', 
    ) 

    wall = models.OneToOneField(
     'blogs.Blog', 
    ) 

可是現在,這種模式遷移我有錯誤:django.db.utils.IntegrityError:UNIQUE約束失敗:persons_person.wall_id。

+0

顯然,如錯誤消息所示,至少有兩個用戶共享相同的'blogs.Blog'。您必須從其中一個用戶那裏刪除該「牆」,或者手動複製數據以爲這些用戶檢索單獨的「牆」。 –

回答

0

您應該更改與Blog模型的關係,因爲其中一個Person可以編寫多個博客,因此它是1-M關係。所以在博客模型中,您應該定義一個ForeignKeyPerson模型。

person = models.ForeignKey(
     'person.Person', 
     related_name='walls'  
    ) 

而且wall領域將從Person模型中取出,而是從人的對象,您將能夠訪問使用相關名稱walls博客。

如果您有PersonBlog作爲1-1關係的必要性,那麼您將不得不從數據庫中刪除不遵循此約束條件的記錄。

+1

這是錯誤的方法。如果您需要一個用戶的多個博客,則需要一個外鍵__來自博客_to_人員。 – knbk

+0

@knbk很好的捕獲,更新的答案。 – falloutcoder

+0

謝謝。當關系字段尚未存在時,我重置了遷移並刪除了所有用戶。然後我添加了這些字段並再次進行遷移,並開始工作。 –