Oli*_*r H 14 python django foreign-key-relationship
我希望我的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)
Run Code Online (Sandbox Code Playgroud)
现在,当我想列出模型的字段时:
def get_fields(model):
return model._meta.fields + model._meta.many_to_many
Run Code Online (Sandbox Code Playgroud)
但我还想获得我的模型的"相关"一对一外键列表.在我的情况下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)]
Run Code Online (Sandbox Code Playgroud)
但我对此并不十分满意.
欢迎任何帮助,想法,提示!
干杯
Dan*_*Dan 10
这个改变了(我认为是1.8),奥利维尔的回答不再适用.根据文档,新方法是
[f for f in User._meta.get_fields()
if f.auto_created and not f.concrete]
Run Code Online (Sandbox Code Playgroud)
这包括一对一,多对一和多对多.
那这个呢:
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
)
]
Run Code Online (Sandbox Code Playgroud)
相关对象可以具有用于关系的字段属性。您只需检查这是否是 OneToOne 字段,您就可以只检索您想要的内容
| 归档时间: |
|
| 查看次数: |
5229 次 |
| 最近记录: |