Как связать Django connection.cursor() с дженериками rest_framework?

Работаю над проектом, в котором мы хотим обойти Django ORM и использовать вместо него прямые SQL-запросы. У нас будет много простых API, поэтому мы хотели использовать rest_framework generics классы представлений. Но наборы запросов, реализованные через connection.cursor(), не обновляются при изменении данных. Т.е. если к generics.ListCreateAPIView сделать POST, то новые данные будут сохранены в БД, но последующие GET-запросы будут показывать набор данных таким, каким он был до POST.

МОДЕЛИ:

from django.db import models    
class identifier_type(models.Model):
        type_name = models.CharField(max_length=25, unique=True)

СЕРИАЛИЗАТОРЫ:

from rest_framework import serializers
from .models import *

class IdentifierTypeSerializer (serializers.ModelSerializer):
    class Meta:
        model = identifier_type
        fields = ['id', 'type_name']

ПРОСМОТРОВ:

from rest_framework import generics
from .models import identifier_type
from .serializers import IdentifierTypeSerializer
from .queries import identifier_type_select_all
from .utils import dict_fetch_all

class IdentifierTypesCR(generics.ListCreateAPIView): 
    queryset = dict_fetch_all(identifier_type_select_all) # does not update GET after PUT
    # queryset = identifier_type.objects.all()  # alternative- Django ORM updates GET after PUT
    serializer_class = IdentifierTypeSerializer

UTILS:

from django.db import connection
def dict_fetch_all(query, *args):
    cursor = connection.cursor()
    cursor.execute(query, *args)
    desc = cursor.description
    rows = cursor.fetchall()
    if rows:
        return [dict(zip([col[0] for col in desc], row)) for row in rows]
    else:
        return None

ЗАПРОСЫ:

identifier_type_select_all = "SELECT * FROM staticdata_identifier_type"

УРЛЫ:

from django.urls import path
from . import views

urlpatterns = [
    path("api/crud/identifier_types", views.IdentifierTypesCR.as_view(), name="api_identifier_types"),
]
Вернуться на верх