【问题标题】:Django ORM: Models with 2 table referencing each otherDjango ORM:具有2个表的模型相互引用
【发布时间】:2016-09-25 02:23:44
【问题描述】:

我有 2 张桌子。用户和组。 1:多关系。每个用户只能属于一个组。

这是model.py。

class Group(models.Model):
    group_name = models.CharField(max_length=150, blank=True, null=True)
    group_description = models.TextField(blank=True, null=True)
    group_creator = models.ForeignKey(User, models.DO_NOTHING)

class User(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    ...
    group = models.ForeignKey(Group, models.DO_NOTHING)

我遇到的问题是它们都相互引用,这在 MySQL 和 Oracle 中是可以接受的,但是在迁移时出现错误:

group_creator = models.ForeignKey(User, models.DO_NOTHING) NameError: 名称“用户”未定义

现在当我颠倒顺序时(因此,用户优先于组),我得到了

group = models.ForeignKey(Group, models.DO_NOTHING, blank=True, null=True) NameError: 名称“组”未定义

这变得非常令人沮丧。我有一些解决方法(将其设置为多:多并将创建者保留在 Group 类中),但在我开始破坏我的数据模型并移动数据之前,我想知道是否有人以前遇到过这个问题。你是怎么解决这个问题的?你真的需要改变你的数据模型吗?

【问题讨论】:

  • 您可以在 ForeignKey 定义中的 User 和 Group 周围加上引号。例如:group = models.ForeignKey('Group', models.DO_NOTHING)

标签: python mysql django


【解决方案1】:

正如 Pourfar 在评论中提到的,您可以通过将模型对象引用为字符串来避免 NameError。设置related_name 来访问这个关系也是安全的。

class Group(models.Model):
    ...
    group_creator = models.ForeignKey('User', related_name='creator_set')

然后,在你的约束下,

每个用户只能属于一个组。

在这种情况下,OneToOneField 更合适。

class User(models.Model):
    ...
    group = models.OneToOneField(Group)

然后你可以访问如下关系:

# USER is a User object
GROUP_BELONGED = USER.group # access to 1-1 relation
GROUP_CREATED = USER.creator_set.all() # reverse access to foreignkey relation
# now GROUP_BELONGED is a Group object
CREATOR = GROUP_BELONGED.group_creator # access to foreignkey relation

【讨论】:

  • 我想 +1 这个答案,但我是 stackoverflow 的菜鸟。谢谢!
【解决方案2】:

related_name 添加到您的ForeignKey 字段:

class Group(models.Model):
    group_name = models.CharField(max_length=150, blank=True, null=True)
    group_description = models.TextField(blank=True, null=True)
    group_creator = models.ForeignKey('User',related_name='myUser')

class User(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    group = models.ForeignKey('Group', related_name='MyGroup')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-08
    • 2021-10-15
    • 2020-09-06
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    相关资源
    最近更新 更多