Как получить определение поля по имени связанных объектов в Django

Мне нужно получить поле связанных объектов модели по имени. Например, если Book имеет поле ForeignKey для Author с именем author, я хотел бы иметь возможность сделать что-то вроде:

field = 'author__name'
Book._meta.get_field(field).verbose_name

Это отношение общего назначения, поэтому строка author__name не известна заранее - я не могу жестко закодировать поля или обход. Более того, она может охватывать более одного отношения, например author__address__city, если есть fk к модели Address на Author.

_meta.get_field() возвращает

MODEL has no field named FIELD

когда я пытаюсь найти такое имя поля с помощью обхода fk. У Django должны быть способы сделать это, так как эти обходы должны выполняться внутри постоянно, но я не смог найти как это сделать в документации или в коде.

Любые идеи приветствуются!

Вы можете разделить ваш поиск по двойному подчеркиванию и затем циклически перебирать части, каждый раз просматривая поле в модели

lookup = 'author__name'
parts = lookup.split('__')
model = Book
for part in parts:
    field = model._meta.get_field(part)
    if field.many_to_one:
        model = field.related_model
    else: # TODO: handle other relationships
        print('Not handled field', field)
        break

Это пока работает только с ForeignKeys

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