Django Rest Framework - Как моделировать и сериализовать данные из MS SQL Хранимая процедура - PullRequest
1 голос
/ 19 февраля 2020

Я новичок в Django, и я пытаюсь создать свое приложение, которое извлекает некоторые данные из базы данных ms sql, я буду признателен за любую помощь, которую вы можете предоставить.

Я использую django-mssql-backend как базу данных db, и использую хранимую процедуру из ms sql, данные из SP могут представлять собой 2 набора результатов, один как правильные данные с 3 столбцами, а другой в случае ошибки с 1 колонкой. Параметры для SP поступают в качестве входных данных от данных запроса.

Я хочу понять, как можно динамически извлекать данные при получении одного из результатов с использованием моделей.
И как я могу динамически сериализовать передайте данные, которые будут проверять входные данные из запроса и манипулировать данными перед возвратом ответа пользователю, используя сериализаторы.

Это то, что у меня есть в настоящее время только для тестирования

# views.py

from rest_framework.decorators import api_view
from rest_framework.response import Response


@api_view(['GET'])
def top_serial2(request, format=None):
    param1 = request.query_params.get('param1')
    param2 = request.query_params.get('param2')

    instance = GetWorkOrder.serials(param1, param2)
    serializer = GetSerializer(instance, many=True)

    return Response(serializer.data)



# models.py

from django.db import models, connections

priority = connections['priority'].cursor()


class GetWorkOrder(models.Model):
    PartNumber = models.CharField(db_column='PartNumber', max_length=50)
    SerialNumber = models.CharField(db_column='SerialNumber', max_length=50)
    Index = models.IntegerField(db_column='Index')
    ErrMessage = models.CharField(db_column='ErrMessage', max_length=256)

    @staticmethod
    def serials(param1, param2):
        try:
            sql = f'EXEC [system].[dbo].[Stored_Procedure] \'{param1}\', \'{param2}\'; '
            results = priority.execute(sql).fetchall()
        finally:
            priority.close()


        return [GetWorkOrder(*row) for row in results]



# serializers.py
"""
I made here a lot of testing so i'm providing them all
"""

from rest_framework import serializers
from .models import GetWorkOrder

class GetSerializer(serializers.BaseSerializer):
    def to_internal_value(self, data):
        param1 = data.get('param1')
        param2 = data.get('param2')

        # Perform the data validation.
        if not param1:
            raise serializers.ValidationError({
                'param1': 'This field is required.'
            })
        if not param2:
            raise serializers.ValidationError({
                'param2': 'This field is required.'
            })

        # Return the validated values. This will be available as
        # the `.validated_data` property.
        return {
            'param1': str(param1),
            'param2': str(param2)
        }

    def to_representation(self, instance):
        print(instance.ErrMessage)
        if instance.PartNumber:
            return {
                'PartNumber': instance.PartNumber,
                'SerialNumber': instance.SerialNumber,
                'Index': instance.Index,
                'ErrMessage': None,
            }
        elif instance.ErrMessage:
            return {
                'PartNumber': None,
                'SerialNumber': None,
                'Index': None,
                'ErrMessage': instance.ErrMessage,
            }


""" I know this is not part of the BaseSerializer, this is just one of my tests """
    class Meta:
        model = GetWorkOrder
        fields = ('PartNumber', 'SerialNumber', 'Index')
        # fields = '__all__'

    def __str__(self):
        pass

Также Мне нужно, чтобы ответ json выглядел примерно так с массивом в одном ключе

{
  "WorkOrder": "string",
  "PartNumber": "string",
  "SerialNumberItems": [
    {
      "SerialNumber": "string",
      "Index": 0
    },
    {
      "SerialNumber": "string",
      "Index": 1
    }
  ]
}

Буду признателен за помощь, спасибо в продвинутом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...