Как связать 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"),
]