django OneToOne 反向访问

Posted

技术标签:

【中文标题】django OneToOne 反向访问【英文标题】:django OneToOne reverse access 【发布时间】:2012-06-20 18:43:23 【问题描述】:

我有这些简单的类

Class A(models.Model):
    ...

Class Meta(models.Model):
    a = models.OnetoOneField(A, primary_key=True)
    width = models.IntegerField(default=100)

但是当我这样做时

a = A()
meta = Meta()
a.save()
meta.a = a
meta.save()
print a.meta.width

我明白了

'A' object has no attribute 'meta'

这是为什么?我使用 OneToOne 错了吗?如果是这样,我怎样才能得到正确的打印语句?

谢谢

【问题讨论】:

不要使用元。它已经在 Django 的其他地方使用。 是的,Meta 的使用非常令人困惑。您还使用 Meta.a 和 a=A() 这增加了混乱 【参考方案1】:

定义一个related_name 来调用反向访问器。

a = models.OneToOneField(A, related_name='foobar')
# ...
a.foobar 

【讨论】:

如果没有相关名称,您可以使用 a.meta 而不是 a.foobar。但绝对不要称模型为“Meta”。 另外提一下,如果您不使用related_name,请使用所有字母小写的型号名称。例如,如果你有 ExtraModel 而不是 Meta,你应该像这样访问它:a.extramodel 参考:docs.djangoproject.com/en/2.1/topics/db/examples/one_to_one

以上是关于django OneToOne 反向访问的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate--对象关系

Django 中的 OneToOne、ManyToMany 和 ForeignKey 字段有啥区别?

检查 Django 中是不是存在 OneToOne 关系

具有 OneToOne 关系的 Django 模型?

无法在 graphene_django 中获取 OneToOne 关系查询的值

Django:为啥要为 UserProfile 创建 OneToOne 而不是子类化 auth.User?