#python #django #swagger-codegen
#python #django #swagger-codegen
Вопрос:
У меня есть существующий проект Django, в котором я пытаюсь разделить серверную часть и интерфейс существующего веб-приложения. Идея состоит в том, чтобы предоставить серверные функции в качестве rest api, а затем также создать веб-приложение, которое позволяет пользователям взаимодействовать с функциональностью API графическим способом. API предоставляет документ swagger / openapi, и я использовал swagger codegen для создания клиента для взаимодействия с ним.
в качестве доказательства концепции я пытаюсь переопределить представление, в котором использовался объект базы данных напрямую, с помощью того, который вызывает api для выполнения той же функциональности
вот исходное представление
def load_mapping_metadata_only_operations(request):
mapping_operation_list = MappingOperation.objects.using('metadata')
print(mapping_operation_list[1])
context = {
'mapping_operation_list': mapping_operation_list,
'transformation_list': [],
'source_table_list': [],
'destination_table_list': [],
}
x = render(request, 'migration_core/migation_tool.html', context)
print(x.content)
return x
и вот представление, которым я сейчас пытаюсь его заменить.
def load_mapping_metadata_only_operations(request):
try:
mapping_operation_response = api_instance.find_models_by_name()
except ApiException as e:
print("Exception when calling MappingApi->find_models_by_name: %sn" % e)
print(mapping_operation_response[1])
api_response_dict =
context = {
'mapping_operation_list': mapping_operation_response,
'transformation_list': [],
'source_table_list': [],
'destination_table_list': [],
}
x = render(request, 'migration_core/migation_tool.html', context)
print(x.content)
return x
это шаблон, на который отправляется список:
<li class="nav-item">
<select class="selectpicker mr-sm-2" data-width="fit" data-live-search="true" title="MappingOperations" onchange="location = this.value">
{% if mapping_operation_list %}
{% for mapping_operation in mapping_operation_list.all %}
<option value="{% url 'load_mapping_metadata_by_operation' mapping_operation.id %}"
{% if mapping_operation_id %}
итак, в старой ситуации mapping_operation_list — это набор запросов, который отлично отображается, в новой ситуации mapping_operation_response — это список объектов MappingOperation, эти объекты не являются тем же классом, что и модель, используемая исходным представлением, они являются объектом класса, сгенерированного с помощью swagger-codegen . У класса есть атрибут name, этот объект не отображается, данные вообще не отображаются.
несколько операторов печати подтвердили мне, что данные действительно извлекаются в новой ситуации, так что это не проблема, шаблон просто не будет отображать результат.
Я не понимаю почему, в этом шаблоне нет ничего, что должно волновать, в каком классе находятся данные, прежде чем они будут отправлены в шаблон. Я думаю, что я что-то упускаю из виду в Django, из-за чего данные просто не отправляются.
Можно ли визуализировать объекты, которые не являются частью модели, используемой django? В частности, объекты, сгенерированные swagger-codegen? Каков наилучший способ сделать это, должен ли я создать dict из этих объектов?
Ответ №1:
Тем временем я обнаружил проблему, мой шаблон use .all (я думал, что это просто язык шаблонов для получения всех элементов в наборе / списке). Оказывается, это метод, специфичный для QuerySet
удаление .все в
{% for mapping_operation in mapping_operation_list.all %}
отобразит данные.