我希望我的Django应用程序能够为任何模型的字段提供一个列表(这将有助于GUI构建本身)。
想象一下这些类(忽略所有字段都可能在Steps中的事实,我有我的原因:-)

class Item(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

class Steps(models.Model):
    item = models.OneToOneField('Item', related_name='steps')
    design = models.BooleanField(default=False)
    prototype = models.BooleanField(default=False)
    production = models.BooleanField(default=False)

现在,当我想列出模型的字段时:
def get_fields(model):
    return model._meta.fields + model._meta.many_to_many

但我还想得到我的模型的“相关”的一对一的外键列表。在我的情况下,Item不会出现在那个列表中。
我发现Item.steps包含所有相关字段。
但当我调用model._meta.get_all_field_names时,它返回一个包含Item._meta.get_field_by_name('steps')的元组,它不会立即告诉我这是一个单一关系还是一对多关系(我只想列出反向的一对一关系)。
此外,我还可以使用以下代码:
from django.db.models.fields.related import SingleRelatedObjectDescriptor
reversed_f_keys = [attr for attr in Item.__dict__.values() \
                  if isinstance(attr, SingleRelatedObjectDescriptor)]

但我对此不太满意。
欢迎任何帮助、想法和提示!
干杯

最佳答案

这已经改变了(我想是1.8),奥利弗的回答也不管用了。根据docs,新方法是

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

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

10-06 05:22