繁体   English   中英

Django 外键:获取相关模型?

[英]Django Foreign Key: get related model?

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

例如,如果我有 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

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

如果 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 中使用选项卡完成发现它,它仍然有效。 您可能想学习使用 shell 对此类内容进行逆向工程。

更新 Django>=2.0 用户

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

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

在尝试提取这样的关系时,我使用了很多命令行实验。 我使用的一个常见模式是_=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 相同的基本模式可用于探索反向关系、多对多关系、从实例而不是类等开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM