Django外键:获取相关模型?

Posted

技术标签:

【中文标题】Django外键:获取相关模型?【英文标题】:Django Foreign Key: get related model? 【发布时间】:2012-05-07 23:59:39 【问题描述】:

是否可以通过外键字段本身获取外键的相关模型?

例如,如果我有 3 个模型:

class ModelA(models.Model)
    field1 = models.CharField(max_length=10)

class ModelB(models.Model)
    field1 = models.CharField(max_length=10)

class ModelC(models.Model)
    field1 = models.CharField(max_length=10)
    field2 = models.ForeignKey(ModelA)
    field3 = models.ForeignKey(ModelB)

我想做:

for field in ModelC._meta.fields:
    if field.get_internal_type() == "ForeignKey":
        #get the related model for field e.g. ModelA or ModelB

这是否可能只使用模型本身而不是模型的实例?

【问题讨论】:

【参考方案1】:

如果 ModelA 有一个名为“foo”的 FK 字段,那么您可以通过以下方式获取相关模型:

ModelA._meta.get_field('foo').rel.to

使用您的代码,它看起来像:

for field in ModelC._meta.fields:
    if field.get_internal_type() == "ForeignKey":
        print field.rel.to

如果很久以前在 shell 中使用 tab 补全发现它,它仍然有效。您可能想学习使用 shell 对类似的东西进行逆向工程。

Django 更新>=2.0 用户

语法已更改。使用以下代码获取相关模型:

ModelA._meta.get_field('foo').related_model

【讨论】:

更新:在新发布的 Django 2.0 中,“rel”似乎不再是 ForeignKey 的字段。你可以试试:ModelA._meta.get_field('foo').related_model。我通过在命令行中键入“tab”来自动完成来解决这个问题。【参考方案2】:

当试图提取这样的关系时,我使用了大量的命令行实验。我使用的一个常见模式是_=starting_point.<chained_attributes>;pprint((_, dir(_)))。例如:

_=ModelC;pprint((_, dir(_)))
_=ModelC.field2;pprint((_, dir(_)))
_=ModelC.field2.field;pprint((_, dir(_)))
_=ModelC.field2.field.rel;pprint((_, dir(_)))
_=ModelC.field2.field.rel.to;pprint((_, dir(_)))

(你需要先做from pprint import pprint,自然。)这让我可以尝试添加/删除属性,直到找到我想要的项目......同时清楚地看到我有什么以及在下一层。由此,我得到 ModelC.field2.field.rel.to == ModelA。相同的基本模式可用于探索反向关系、多对多关系、从实例而不是类开始等。

【讨论】:

以上是关于Django外键:获取相关模型?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django rest 框架中获取与外键相关的数据?

Django-获取外键模型

如何在 Django html 页面中显示外键数据?

使用外键查询 Django 模型并获取登录用户

编写一个 django 查询并在一次数据库中获取反向相关对象!

如何获取Django中子模型中存在外键的父模型的所有对象?