Python Django:列出模型的所有反向关系

Python Django:列出模型的所有反向关系,python,django,foreign-key-relationship,Python,Django,Foreign Key Relationship,我希望我的django应用程序能够提供任何模型字段的列表(这将有助于GUI本身的构建) 想象一下这些类(忽略步骤的所有字段都可能位于项中的事实,我有我的理由:-) 现在,当我想列出模型的字段时: def get_fields(model): return model._meta.fields + model._meta.many_to_many 但我也想得到我的模型的“相关”一对一外键列表。在我的例子中,项。步骤不在该列表中 我发现model.\u meta.get\u all\u f

我希望我的django应用程序能够提供任何模型字段的列表(这将有助于GUI本身的构建)

想象一下这些类(忽略
步骤的所有字段都可能位于
项中的事实,我有我的理由:-)

现在,当我想列出模型的字段时:

def get_fields(model):
    return model._meta.fields + model._meta.many_to_many
但我也想得到我的模型的“相关”一对一外键列表。在我的例子中,
项。步骤不在该列表中

我发现
model.\u meta.get\u all\u field\u name
确实包含所有相关字段

但是当我调用
Item.\u meta.get\u field\u by\u name('steps')
时,它返回一个包含
RelatedObject
的元组,它不会立即告诉我这是一个单关系还是一对多关系(我只想列出反向的一对一关系)

此外,我还可以使用以下代码:

from django.db.models.fields.related import SingleRelatedObjectDescriptor
reversed_f_keys = [attr for attr in Item.__dict__.values() \
                  if isinstance(attr, SingleRelatedObjectDescriptor)]
但我对此并不十分满意

欢迎任何帮助、想法和提示

干杯,那么这个呢:

oneToOneFieldNames = [
    field_name 
    for field_name in Item._meta.get_all_field_names() 
    if isinstance(
        getattr(
            Item._meta.get_field_by_name(field_name)[0], 
            'field', 
            None
        ), 
        models.OneToOneField
    )
]

RelatedObject可能具有关系的字段属性。你只需要检查一下这是否是一个OneToOne字段,你只能检索你想要的我发现有一些
模型的方法。_meta
可以给我想要的

my_model = get_model('app_name','model_name')
# Reverse foreign key relations
reverse_fks = my_model._meta.get_all_related_objects()
# Reverse M2M relations
reverse_m2ms = my_model._meta.get_all_related_many_to_many_objects()
通过解析关系的内容,我可以猜测“direct”字段是一个
OneToOneField
还是其他任何字段。

这已经改变了(我认为是在1.8中),Olivier的答案不再有效。根据该报告,新的方法是

[f for f in Item._meta.get_fields()
    if f.auto_created and not f.concrete]

这包括一对一、多对一和多对多。

是的,我有一个潜在的解决方案来满足我的需要,但我很高兴有一个更好的解决方案:)谢谢你的提醒。当我升级到1.10时,这会让我省去一个头疼的问题:)(但现在仍然坚持使用1.6)天哪,我真不敢相信我以前从来没有想过这一点,所以如果它是自动创建的,而不是具体的,它将始终是一个反向关系?这个解决方案有一个问题,它还列出了许多具有穿透性的正向关系,我找到了一种过滤它们的方法,但它非常繁琐,有助于确定正确的过滤器集。@Mojimi:问得好。模型上会出现一个像magic一样的反向关系,因此它是
自动创建的
。包含外键的实际数据库列不是模型的一部分(它是相关模型的一部分),因此它不是具体的。另一方面,例如,
id
字段也是
自动创建的
,但它是
具体的
,而
外键
字段不是
自动创建的
,而是
具体的
。我想知道例如
f.is\u关系和f.auto\u created
是否也可以工作。
[f for f in Item._meta.get_fields()
    if f.auto_created and not f.concrete]