首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django外键:获取相关模型?

Django外键:获取相关模型?
EN

Stack Overflow用户
提问于 2012-04-27 16:20:49
回答 2查看 11.4K关注 0票数 18

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

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

代码语言:javascript
复制
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)

我想做的是:

代码语言:javascript
复制
for field in ModelC._meta.fields:
    if field.get_internal_type() == "ForeignKey":
        #get the related model for field e.g. ModelA or ModelB

仅仅使用模型本身而不是模型的实例,这是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-27 16:29:40

如果ModelA具有名为"foo“的FK字段,则可以通过以下方式获取相关模型:

代码语言:javascript
复制
ModelA._meta.get_field('foo').rel.to

使用您的代码,它将如下所示:

代码语言:javascript
复制
for field in ModelC._meta.fields:
    if field.get_internal_type() == "ForeignKey":
        print field.rel.to

如果很久以前在shell中使用制表符补全找到了它,它仍然可以工作。您可能想要学习如何使用shell对类似的东西进行逆向工程。

针对Django>=2.0用户的更新

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

代码语言:javascript
复制
ModelA._meta.get_field('foo').related_model
票数 26
EN

Stack Overflow用户

发布于 2014-11-14 03:14:31

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

代码语言:javascript
复制
_=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。相同的基础模式可用于探索反向关系、多对多关系、从实例开始而不是从类开始等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10347210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档