Как получить определение поля по имени связанных объектов в 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