是否可以通过外键字段本身获取外键的相关模型?
例如,如果我有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仅仅使用模型本身而不是模型的实例,这是可能的吗?
发布于 2012-04-27 16:29:40
如果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发布于 2014-11-14 03:14:31
在尝试提取这样的关系时,我使用了大量的命令行实验。我使用的一个常见模式是_=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。相同的基础模式可用于探索反向关系、多对多关系、从实例开始而不是从类开始等。
https://stackoverflow.com/questions/10347210
复制相似问题