解决Django中'ManyToOneRel'对象无'verbose_name'属性的报错
问题解决:Django获取模型字段verbose_name时的AttributeError
问题原因
Category._meta.get_fields()方法默认会返回模型的所有关联对象,包括反向关联关系(比如MasterList中指向Category的外键,会在Category的_meta中生成一个ManyToOneRel类型的反向关联对象)。这类关系对象不属于普通字段,没有verbose_name属性,遍历取值时就会触发AttributeError。
解决方案
方案1:限制只获取当前模型的显式字段
调用get_fields()时传入参数,排除父类继承的字段和隐藏的关联字段:
model_fields = [(f.verbose_name, f.name) for f in Category._meta.get_fields(include_parents=False, include_hidden=False)]
方案2:过滤出真正的字段对象
通过类型判断,只保留django.db.models.Field的实例:
from django.db.models import Field model_fields = [(f.verbose_name, f.name) for f in Category._meta.get_fields() if isinstance(f, Field)]
说明
- 方案1更高效,直接通过参数限制返回结果,适合只需要当前模型自身定义字段的场景;
- 方案2更灵活,可根据需求调整过滤条件,比如需要保留部分关联字段时。
内容的提问来源于stack exchange,提问作者wsrt
相关产品推荐
相关产品推荐

