2016-11-25 4 views
0

В базе данных я уже зарегистрировал 4 человека, но они были зарегистрированы, когда модель еще не имела атрибутов отношения. Когда я добавил их, я получил эту модель:Ограничение Django UNIQUE не удалось с OneToOneField при миграции в Django User Model

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 блога, отсюда его отношение 1-М. Таким образом, в модели блога вы должны определить модель ForeignKey до Person.

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

И wall поле будут удалены из Person модели, но от человека объекты, которые вы сможете получить доступ к блогам, используя родственное имя walls.

Если у вас есть необходимость иметь Person до Blog как отношение 1-1, то вам придется удалить записи из базы данных, которые не следуют этому ограничению.

+1

Это не так. Если вам нужен несколько блогов для одного пользователя, вам нужен внешний ключ _from_ blog _to_ person. – knbk

+0

@knbk Nice catch, обновленный ответ. – falloutcoder

+0

Спасибо. Я сбросил миграцию и удалил всех пользователей, когда поля отношения еще не существовали. Затем я добавил эти поля и снова выполнил миграцию, и он начал работать. –