Django的外键:获取相关模型?(Django Foreign Key: get related

2019-07-29 04:27发布

是否有可能通过外键字段本身得到一个外键的相关模型?

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

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

Answer 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

如果发现它在外壳使用tab完成不久前,它仍然有效。 你可能想了解使用shell进行逆向工程类的东西。



Answer 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 Foreign Key: get related model?