是否有可能通过外键字段本身得到一个外键的相关模型?
举例来说,如果我有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
如果发现它在外壳使用tab完成不久前,它仍然有效。 你可能想了解使用shell进行逆向工程类的东西。
当试图提取这样的关系,我用了很多命令行实验。 我使用的常见模式是_=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
。 相同的基本图案可用于探索反向关系,多到多的关系,从一个实例而不是类等