我希望我的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')
时,它会返回一个持有RelatedObject
的元组,它不会立即告诉我这是单关系还是一对多关系(我想仅列出反向的一对一关系)。
另外,我可以使用这段代码:
from django.db.models.fields.related import SingleRelatedObjectDescriptor
reversed_f_keys = [attr for attr in Item.__dict__.values() \
if isinstance(attr, SingleRelatedObjectDescriptor)]
但我对此并不十分满意。
欢迎任何帮助,想法,提示!
干杯
答案 0 :(得分:9)
这已经改变了(我认为是1.8),Olivier的回答已经不再适用了。根据{{3}},新方法是
[f for f in User._meta.get_fields()
if f.auto_created and not f.concrete]
这包括一对一,多对一和多对多。
答案 1 :(得分:3)
我发现有=IF(COUNTIF($B$2:$B$19,B2)>1,MAX(IF($B$2:$B$19=B2,$D$2:$D$19)))
的方法可以给我我想要的东西。
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()
还是其他。
答案 2 :(得分: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字段,您只能检索您想要的内容