【问题标题】:What does this Django migration error message mean?这个 Django 迁移错误消息是什么意思?
【发布时间】:2020-10-12 16:01:59
【问题描述】:

当我尝试为下面显示的 Django 模型创建迁移时,我收到一条我不理解的错误消息。我正在尝试为可以添加一个或多个其他成员作为朋友或关注者的网站成员建模。此外,一个成员可以阻止任何其他成员。这是我的模型:

class Member(models.Model):
    FRIEND = "friend_of"
    FOLLOWS = "follows"
    RELATION_TYPES = ((FRIEND, "friend"), (FOLLOWS, "follower"))

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    relations = models.ManyToManyField(
        "self", choices=RELATION_TYPES, through="MemberRelation"
    )
    blocks = models.ManyToManyField("self", through="MemberBlock")

    def __str__(self):
        return self.user.first_name

class MemberRelation(models.Model):
    source = models.ForeignKey(
        "Member", related_name="source_member", on_delete=models.CASCADE
    )
    target = models.ForeignKey(
        "Member", related_name="target_member", on_delete=models.CASCADE
    )
    relation = models.CharField(max_length=8)  # Contains Member.FRIEND or .FOLLOWER

    def __str__(self):
        return "Member {} {} member {}".format(self.source, self.relation, self.target)

class MemberBlock(models.Model):
    source = models.ForeignKey(
        "Member", related_name="blocker", on_delete=models.CASCADE,
    )
    target = models.ForeignKey(
        "Member", related_name="blocked", on_delete=models.CASCADE,
    )

    def __str__(self):
        return "Member {} is blocking Member {}".format(self.source, self.target)

我从 Member 和 MemberRelaton 类开始,我的迁移运行没有任何错误。但是,在我的 Member 模型中添加 MemberBlock 类和 blocks ManyToMany 字段后,当我运行我不明白的 makemigrations 命令时出现以下错误:

  You are trying to change the nullable field 'source' on memberrelation to non-nullable without a default; we can't do that (the database needs something to populate existing rows).
  Please select a fix:
  1) Provide a one-off default now...
  2) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL operation to handle NULL values in a previous data migration)
  3) Quit, and let me add a default in models.py
  Select an option:

我不明白这个错误,因为 1) 现在我添加了 MemberBlock 类,它正在谈论 MemberRelation 类。以前这个类没有问题;和 2) 错误是说“源”字段可以为空,我认为它不是。

最初,我在没有 through 选项的情况下声明了 blocks,并且遇到了同样的错误。我添加了 through 选项,因为我认为 Django 可能对我在一个类中有两个递归 ManyToMany 字段这一事实感到困惑。

我做错了什么?

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    解决办法如下:

    blocked = models.ManyToManyField("self", symmetrical=False, related_name="members")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      • 2010-10-01
      • 2015-06-22
      • 1970-01-01
      相关资源
      最近更新 更多