DJANGO: как визуализировать объекты модели swagger-codegen вместо объекта модели базы данных

#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 %}
 

отобразит данные.