Как преодолеть ошибку: объект 'ManyToOneRel' не имеет атрибута 'verbose_name' в приложении Django
В моем приложении есть следующие модели:
class Category(BaseStampModel):
cat_id = models.AutoField(primary_key=True, verbose_name='Cat Id')
category = models.CharField(max_length=55, verbose_name='Category')
class MasterList(BaseStampModel):
master_list_id = models.AutoField(primary_key=True, verbose_name='Master List Id')
mast_list_category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, verbose_name='Category')
# Other fields ...
Моя BaseModel выглядит следующим образом:
class BaseStampModel(models.Model):
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='%(class)s_created', blank=True, null=True, on_delete=models.SET_NULL, verbose_name='Created by')
created_on = models.DateTimeField(auto_now_add = True, null=True, blank=True)
С помощью этого я могу отображать объекты модели и создавать/обновлять экземпляры.
В моем представлении, когда я хочу получить verbose_name
из модели "Category", используя:
`model_fields = [(f.verbose_name, f.name) for f in Category._meta.get_fields()]`
Я получаю следующую ошибку в моем браузере:
AttributeError: объект 'ManyToOneRel' не имеет атрибута 'verbose_name'
Если я удалю связь FK из поля mast_list_category
(сделаю его простым CharField
), я не получу ошибку.
Прошел миллионы страниц, но решения пока нет.
Любая помощь будет высоко оценена.
Вы не можете получить доступ к verbose_name так же, как и к полям модели
Но есть разные способы получения verbose_name. Лучшим способом является использование get_field
model._meta.get_field('field_name').verbose_name
В вашем случае замените model
на Category
и field_name
на поле, которое вы хотите получить verbose_name
Вот что я делаю:
Объявите пустой массив, пройдитесь циклом по модели, получите имя поля и его verbose_name и добавьте.
array_model_with_ver_name = []
for f in Category._meta.get_fields():
if hasattr(f, 'verbose_name'):
array_model_with_ver_name.append((f.verbose_name, f.name))
У меня была та же проблема, model._meta._get_fields(reverse=False)
все получилось, как сказано в официальной документации
Если reverse=True, то возвращаются отношения, указывающие на эту модель.
По умолчанию model._meta.get_fields()
также возвращает поля из других моделей, указывающих на нашу модель