Django модель динамически запрашивает значения поля ManyToManyField

Следующий код работает нормально для объекта, который имеет ManyToManyField, называемые ссылками следующим образом:

res = []
for ref in MyBook.objects.get(id=some_id).references.values("f_name", "l_name"):
    res.append(ref)

Мой вопрос в том, как я могу динамически получить указатель на ссылки, учитывая только строку "references"?

Теперь у меня есть экземпляр класса MyBook вот так:

my_book_model = MyBook.objects.get(id=some_id)

Я не знаю, как получить указатель на my_book_model.references. Если у меня есть этот указатель, то я могу просто передать массив значений в указатель.values(values_array)

Вы можете работать с getattr(…) [Python-doc]:

getattr(my_book_model, 'references').values('f_name', 'l_name')
Таким образом,

so getattr(x, 'y') эквивалентно x.y. Однако следует быть осторожным: если можно использовать произвольную строку, люди могут использовать это как уязвимость безопасности.

Furthermore the use of .values(…) [Django-doc] is often not a good idea either. One can use serializers to convert model objects to dictionaries. This article [Django-antipatterns] explains problems with using .values(…).

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