feat: ADRF async views (phase1) + native async serializers (phase2) + async cache infra
This commit is contained in:
+49
-47
@@ -1,16 +1,18 @@
|
||||
from rest_framework import serializers
|
||||
from adrf.serializers import (
|
||||
ModelSerializer, SerializerMethodField,
|
||||
)
|
||||
from .models import Course, Chapter, ChapterContent, CourseMaterial
|
||||
|
||||
|
||||
class ChapterSerializer(serializers.ModelSerializer):
|
||||
video_poster_url = serializers.SerializerMethodField()
|
||||
video_local_url = serializers.SerializerMethodField()
|
||||
class ChapterSerializer(ModelSerializer):
|
||||
video_poster_url = SerializerMethodField()
|
||||
video_local_url = SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Chapter
|
||||
fields = ['id', 'title', 'sort_order', 'duration', 'is_free', 'video_url', 'video_source', 'video_local_url', 'video_poster_url', 'created_at', 'updated_at']
|
||||
|
||||
def get_video_poster_url(self, obj):
|
||||
async def get_video_poster_url(self, obj):
|
||||
if obj.video_poster:
|
||||
request = self.context.get('request')
|
||||
if request:
|
||||
@@ -18,7 +20,7 @@ class ChapterSerializer(serializers.ModelSerializer):
|
||||
return obj.video_poster.url
|
||||
return ''
|
||||
|
||||
def get_video_local_url(self, obj):
|
||||
async def get_video_local_url(self, obj):
|
||||
if obj.video_local:
|
||||
request = self.context.get('request')
|
||||
if request:
|
||||
@@ -27,22 +29,22 @@ class ChapterSerializer(serializers.ModelSerializer):
|
||||
return ''
|
||||
|
||||
|
||||
class ChapterContentSerializer(serializers.ModelSerializer):
|
||||
class ChapterContentSerializer(ModelSerializer):
|
||||
class Meta:
|
||||
model = ChapterContent
|
||||
fields = ['id', 'chapter', 'content_md', 'content_html', 'md_file_path', 'updated_at']
|
||||
|
||||
|
||||
class MaterialSerializer(serializers.ModelSerializer):
|
||||
file_url = serializers.SerializerMethodField()
|
||||
file_size_display = serializers.SerializerMethodField()
|
||||
file_type_display = serializers.SerializerMethodField()
|
||||
class MaterialSerializer(ModelSerializer):
|
||||
file_url = SerializerMethodField()
|
||||
file_size_display = SerializerMethodField()
|
||||
file_type_display = SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = CourseMaterial
|
||||
fields = ['id', 'title', 'file_url', 'file_type', 'file_type_display', 'file_size', 'file_size_display', 'download_count', 'sort_order', 'created_at']
|
||||
|
||||
def get_file_url(self, obj):
|
||||
async def get_file_url(self, obj):
|
||||
if obj.file:
|
||||
request = self.context.get('request')
|
||||
if request:
|
||||
@@ -50,7 +52,7 @@ class MaterialSerializer(serializers.ModelSerializer):
|
||||
return obj.file.url
|
||||
return ''
|
||||
|
||||
def get_file_size_display(self, obj):
|
||||
async def get_file_size_display(self, obj):
|
||||
size = obj.file_size
|
||||
if size < 1024:
|
||||
return f'{size} B'
|
||||
@@ -59,7 +61,7 @@ class MaterialSerializer(serializers.ModelSerializer):
|
||||
else:
|
||||
return f'{size / (1024 * 1024):.1f} MB'
|
||||
|
||||
def get_file_type_display(self, obj):
|
||||
async def get_file_type_display(self, obj):
|
||||
type_map = {
|
||||
'pdf': 'PDF',
|
||||
'code': '代码',
|
||||
@@ -72,14 +74,14 @@ class MaterialSerializer(serializers.ModelSerializer):
|
||||
return type_map.get(obj.file_type, '其他')
|
||||
|
||||
|
||||
class ChapterSerializer(serializers.ModelSerializer):
|
||||
video_poster_url = serializers.SerializerMethodField()
|
||||
class ChapterSerializer(ModelSerializer):
|
||||
video_poster_url = SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Chapter
|
||||
fields = ['id', 'title', 'sort_order', 'duration', 'is_free', 'video_url', 'video_poster_url', 'created_at', 'updated_at']
|
||||
|
||||
def get_video_poster_url(self, obj):
|
||||
async def get_video_poster_url(self, obj):
|
||||
if obj.video_poster:
|
||||
request = self.context.get('request')
|
||||
if request:
|
||||
@@ -88,17 +90,17 @@ class ChapterSerializer(serializers.ModelSerializer):
|
||||
return ''
|
||||
|
||||
|
||||
class ChapterContentSerializer(serializers.ModelSerializer):
|
||||
class ChapterContentSerializer(ModelSerializer):
|
||||
class Meta:
|
||||
model = ChapterContent
|
||||
fields = ['id', 'chapter', 'content_md', 'content_html', 'md_file_path', 'updated_at']
|
||||
|
||||
|
||||
class CourseListSerializer(serializers.ModelSerializer):
|
||||
author_name = serializers.SerializerMethodField()
|
||||
chapters_count = serializers.SerializerMethodField()
|
||||
students_count = serializers.SerializerMethodField()
|
||||
cover_image_url = serializers.SerializerMethodField()
|
||||
class CourseListSerializer(ModelSerializer):
|
||||
author_name = SerializerMethodField()
|
||||
chapters_count = SerializerMethodField()
|
||||
students_count = SerializerMethodField()
|
||||
cover_image_url = SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Course
|
||||
@@ -109,13 +111,13 @@ class CourseListSerializer(serializers.ModelSerializer):
|
||||
'sort_order', 'is_hot', 'is_new', 'created_at', 'updated_at',
|
||||
]
|
||||
|
||||
def get_chapters_count(self, obj):
|
||||
return obj.chapters.count()
|
||||
async def get_chapters_count(self, obj):
|
||||
return await obj.chapters.acount()
|
||||
|
||||
def get_students_count(self, obj):
|
||||
async def get_students_count(self, obj):
|
||||
return 0
|
||||
|
||||
def get_cover_image_url(self, obj):
|
||||
async def get_cover_image_url(self, obj):
|
||||
if obj.cover_image:
|
||||
request = self.context.get('request')
|
||||
if request:
|
||||
@@ -123,18 +125,18 @@ class CourseListSerializer(serializers.ModelSerializer):
|
||||
return obj.cover_image.url
|
||||
return ''
|
||||
|
||||
def get_author_name(self, obj):
|
||||
async def get_author_name(self, obj):
|
||||
if obj.author:
|
||||
return obj.author.get_full_name() or obj.author.username
|
||||
return ''
|
||||
|
||||
|
||||
class CourseDetailSerializer(serializers.ModelSerializer):
|
||||
author_name = serializers.SerializerMethodField()
|
||||
class CourseDetailSerializer(ModelSerializer):
|
||||
author_name = SerializerMethodField()
|
||||
chapters = ChapterSerializer(many=True, read_only=True)
|
||||
chapters_count = serializers.SerializerMethodField()
|
||||
students_count = serializers.SerializerMethodField()
|
||||
cover_image_url = serializers.SerializerMethodField()
|
||||
chapters_count = SerializerMethodField()
|
||||
students_count = SerializerMethodField()
|
||||
cover_image_url = SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Course
|
||||
@@ -145,13 +147,13 @@ class CourseDetailSerializer(serializers.ModelSerializer):
|
||||
'sort_order', 'is_hot', 'is_new', 'created_at', 'updated_at',
|
||||
]
|
||||
|
||||
def get_chapters_count(self, obj):
|
||||
return obj.chapters.count()
|
||||
async def get_chapters_count(self, obj):
|
||||
return await obj.chapters.acount()
|
||||
|
||||
def get_students_count(self, obj):
|
||||
async def get_students_count(self, obj):
|
||||
return 0
|
||||
|
||||
def get_cover_image_url(self, obj):
|
||||
async def get_cover_image_url(self, obj):
|
||||
if obj.cover_image:
|
||||
request = self.context.get('request')
|
||||
if request:
|
||||
@@ -159,25 +161,25 @@ class CourseDetailSerializer(serializers.ModelSerializer):
|
||||
return obj.cover_image.url
|
||||
return ''
|
||||
|
||||
def get_author_name(self, obj):
|
||||
async def get_author_name(self, obj):
|
||||
if obj.author:
|
||||
return obj.author.get_full_name() or obj.author.username
|
||||
return ''
|
||||
|
||||
|
||||
class CourseCreateUpdateSerializer(serializers.ModelSerializer):
|
||||
class CourseCreateUpdateSerializer(ModelSerializer):
|
||||
class Meta:
|
||||
model = Course
|
||||
fields = ['title', 'description', 'category', 'level', 'cover_image', 'color', 'icon_name', 'status', 'sort_order', 'is_hot', 'is_new']
|
||||
|
||||
def create(self, validated_data):
|
||||
async def acreate(self, validated_data):
|
||||
validated_data['author'] = self.context['request'].user
|
||||
return super().create(validated_data)
|
||||
return await super().acreate(validated_data)
|
||||
|
||||
|
||||
class CourseManageSerializer(serializers.ModelSerializer):
|
||||
author_name = serializers.SerializerMethodField()
|
||||
chapters_count = serializers.SerializerMethodField()
|
||||
class CourseManageSerializer(ModelSerializer):
|
||||
author_name = SerializerMethodField()
|
||||
chapters_count = SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = Course
|
||||
@@ -187,10 +189,10 @@ class CourseManageSerializer(serializers.ModelSerializer):
|
||||
'author_name', 'created_at', 'updated_at',
|
||||
]
|
||||
|
||||
def get_chapters_count(self, obj):
|
||||
return obj.chapters.count()
|
||||
async def get_chapters_count(self, obj):
|
||||
return await obj.chapters.acount()
|
||||
|
||||
def get_author_name(self, obj):
|
||||
async def get_author_name(self, obj):
|
||||
if obj.author:
|
||||
return obj.author.get_full_name() or obj.author.username
|
||||
return ''
|
||||
|
||||
Reference in New Issue
Block a user