Django ModelSerializer будет работать только в случае объекта QuerySet , полученного из моделей. Выполнение запросов с использованием объекта подключения приведет к появлению Python собственных типов данных, таких как List и Tuple , для которых ModelSerializer не будет работать. Итак, в этом случае cursor.fetchall()
даст список tuples
, и каждый кортеж состоит из реляционной строки БД. Поэтому для сериализации этих типов данных вместо ModelSerializer используйте только Serializer . Ниже фрагмент кода даст подробное представление о SerializerMethodField .
View.py
class RawQueryDjango(APIView):
def get(self, request):
from django.db import connection
cursor = connection.cursor()
cursor.execute('select * from products_usermodel')
res = cursor.fetchall()
serializer = RawQuerySerializer(res, many=True)
print(serializer.data)
return Response({'detail': serializer.data})
Serializer.py
from rest_framework.serializers import Serializer, ModelSerializer, SerializerMethodField
class RawQuerySerializer(Serializer):
name = SerializerMethodField()
last_name = SerializerMethodField()
def get_name(self, obj):
return obj[1]
def get_last_name(self, obj):
return obj[2] # index value at which last_name in tuple
Это даст следующий ответ. При выполнении необработанного запроса взаимодействие с моделью не производилось.
{
"detail": [
{
"name": "abc",
"last_name": "sadfasd"
},
{
"name": "asasasd",
"last_name": "werwe"
},
{
"name": "asdafa",
"last_name": "1231weasd"
},
{
"name": "sh",
"last_name": "patil"
}
]
}