【问题标题】:Django UNIQUE constraint failed with OneToOneField while migrate in Django User Model在 Django 用户模型中迁移时,Django UNIQUE 约束因 OneToOneField 失败
【发布时间】:2017-04-09 18:57:17
【问题描述】:

在数据库中,我已经注册了 4 个人,但他们在模型还没有关系属性时注册。当我添加它们时,我得到了这个模型:

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 constraint failed: persons_person.wall_id。

【问题讨论】:

  • 显然,正如错误消息所示,至少有两个用户共享相同的blogs.Blog。您必须从其中一位用户中删除 wall,或者手动复制数据以检索这些用户的单独 walls。

标签: python django sqlite models


【解决方案1】:

您应该更改与Blog 模型的关系,因为一个Person 可以写超过1 个博客,因此它是1-M 关系。所以在 Blog 模型中你应该定义一个 ForeignKeyPerson 模型。

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

并且wall 字段将从Person 模型中删除,但从个人对象中,您将能够使用相关名称walls 访问博客。

如果您需要将PersonBlog 作为1-1 关系,那么您将不得不从数据库中删除不遵循此约束的记录。

【讨论】:

  • 这是错误的方法。如果您需要一个用户的多个博客,则需要一个外键 from blog to person。
  • 谢谢。当关系字段尚不存在时,我重置了迁移并删除了所有用户。然后我添加了这些字段并再次进行了迁移,它开始工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 2017-03-04
  • 2020-04-24
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
相关资源
最近更新 更多