18

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

Steps想象一下课程(忽略所有领域都可能在的事实Item,我有我的理由:-))

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.steps,不会在该列表中。

我发现model._meta.get_all_field_names确实包括所有相关领域。

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

另外,我可以使用这段代码:

from django.db.models.fields.related import SingleRelatedObjectDescriptor
reversed_f_keys = [attr for attr in Item.__dict__.values() \
                  if isinstance(attr, SingleRelatedObjectDescriptor)]

但我对此不是很满意。

欢迎任何帮助,想法,提示!

干杯

4

3 回答 3

20

这已更改(我认为在 1.8 中)并且 Olivier 的答案不再起作用。根据文档,新方法是

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

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

于 2017-03-06T13:47:28.950 回答
3

我发现有一些方法Model._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()

通过解析关系的内容,我可以猜测“直接”字段是 aOneToOneField还是什么。

于 2015-06-16T13:08:46.040 回答
0

那么这个呢:

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 可能具有关系的 Field 属性。你只需要检查这是否是一个 OneToOne 字段,你可以只检索你想要的

于 2014-07-09T13:57:53.927 回答