feat: ADRF async views (phase1) + native async serializers (phase2) + async cache infra

This commit is contained in:
async-upgrade
2026-09-06 14:26:17 +08:00
parent 9a6577f71e
commit 8f488fcaaa
55 changed files with 2224 additions and 1513 deletions
+33 -16
View File
@@ -1,10 +1,14 @@
from rest_framework import generics, permissions, status
from rest_framework import status
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser, JSONParser
from asgiref.sync import sync_to_async
from django.utils import timezone
from drf_yasg.utils import swagger_auto_schema
from drf_yasg import openapi
from chunyu_project.common_schemas import success_response, error_response, unauthorized_response, not_found_response
from adrf import generics
from .models import BugReport, BugReportComment
from .serializers import (
BugReportListSerializer,
@@ -35,12 +39,15 @@ class BugReportListCreateAPIView(generics.ListCreateAPIView):
operation_description='获取当前用户提交的所有Bug反馈列表',
responses={200: success_response, 401: unauthorized_response}
)
def list(self, request, *args, **kwargs):
async def list(self, request, *args, **kwargs):
queryset = self.get_queryset()
serializer = self.get_serializer(queryset, many=True)
items = [x async for x in queryset]
serializer = self.get_serializer(items, many=True)
# 兜底:user_name 触发 user 外键懒加载、images_count 内部有同步 ORM count()
data = await sync_to_async(lambda: serializer.data)()
return create_standardized_response(
code=ResponseCode.SUCCESS,
data=serializer.data,
data=data,
message='获取Bug反馈列表成功'
)
@@ -51,14 +58,18 @@ class BugReportListCreateAPIView(generics.ListCreateAPIView):
request_body=BugReportCreateSerializer,
responses={201: success_response, 400: error_response, 401: unauthorized_response}
)
def create(self, request, *args, **kwargs):
async def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
bug_report = serializer.save(user=request.user)
is_valid = await sync_to_async(serializer.is_valid)()
if is_valid:
# 兜底:serializer.create 内部有同步 ORM(BugReport/BugReportImage/BugReportAttachment 的 create)
bug_report = await sync_to_async(serializer.save)(user=request.user)
detail_serializer = BugReportDetailSerializer(bug_report)
# 兜底:detail 序列化会触发 user/images/attachments/comments 的同步懒加载
data = await sync_to_async(lambda: detail_serializer.data)()
return create_standardized_response(
code=ResponseCode.SUCCESS,
data=detail_serializer.data,
data=data,
message='Bug反馈提交成功',
status_code=status.HTTP_201_CREATED
)
@@ -88,13 +99,15 @@ class BugReportDetailAPIView(generics.RetrieveAPIView):
],
responses={200: success_response, 401: unauthorized_response, 404: not_found_response}
)
def retrieve(self, request, *args, **kwargs):
async def retrieve(self, request, *args, **kwargs):
try:
instance = self.get_object()
instance = await self.get_object()
serializer = self.get_serializer(instance)
# 兜底:detail 序列化会触发 user/images/attachments/comments 的同步懒加载
data = await sync_to_async(lambda: serializer.data)()
return create_standardized_response(
code=ResponseCode.SUCCESS,
data=serializer.data,
data=data,
message='获取Bug反馈详情成功'
)
except BugReport.DoesNotExist:
@@ -119,10 +132,10 @@ class BugReportCommentCreateAPIView(generics.CreateAPIView):
request_body=BugReportCommentCreateSerializer,
responses={201: success_response, 400: error_response, 401: unauthorized_response, 404: not_found_response}
)
def create(self, request, *args, **kwargs):
async def create(self, request, *args, **kwargs):
bug_report_id = kwargs.get('bug_report_id')
try:
bug_report = BugReport.objects.get(id=bug_report_id, user=request.user)
bug_report = await BugReport.objects.aget(id=bug_report_id, user=request.user)
except BugReport.DoesNotExist:
return create_standardized_error_response(
code=ResponseCode.NOT_FOUND,
@@ -131,16 +144,20 @@ class BugReportCommentCreateAPIView(generics.CreateAPIView):
)
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
comment = serializer.save(
is_valid = await sync_to_async(serializer.is_valid)()
if is_valid:
# 兜底:serializer.create 内部有同步 ORM(comment 及其图片/附件的 create)
comment = await sync_to_async(serializer.save)(
user=request.user,
bug_report=bug_report,
is_admin=False
)
comment_serializer = BugReportCommentSerializer(comment)
# 兜底:comment 序列化会触发 user 外键与 images/attachments 的同步懒加载
data = await sync_to_async(lambda: comment_serializer.data)()
return create_standardized_response(
code=ResponseCode.SUCCESS,
data=comment_serializer.data,
data=data,
message='回复成功',
status_code=status.HTTP_201_CREATED
)