Django外键:得到相关模型?

时间:2012-04-27 08:20:49

标签: python django django-models foreign-keys

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

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

仅使用模型本身而不是模型实例是否可行?

2 个答案:

答案 0 :(得分:25)

如果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来反向工程。

答案 1 :(得分:1)

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