Как преодолеть ошибку: объект '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() также возвращает поля из других моделей, указывающих на нашу модель

Вернуться на верх