Я новичок в 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
}
]
}
Буду признателен за помощь, спасибо в продвинутом