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(…)
.