feat: ADRF async views (phase1) + native async serializers (phase2) + async cache infra
This commit is contained in:
+30
-27
@@ -1,20 +1,23 @@
|
||||
from rest_framework import serializers
|
||||
from adrf.serializers import (
|
||||
ModelSerializer, Serializer, CharField, ChoiceField, FileField,
|
||||
IntegerField, BooleanField, ListField, SerializerMethodField,
|
||||
)
|
||||
from .models import CompressionHistory, ToolCategory, Tool, ColorHistory
|
||||
|
||||
|
||||
class ToolCategorySerializer(serializers.ModelSerializer):
|
||||
tool_count = serializers.SerializerMethodField()
|
||||
class ToolCategorySerializer(ModelSerializer):
|
||||
tool_count = SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = ToolCategory
|
||||
fields = ['id', 'name', 'icon', 'sort_order', 'tool_count', 'created_at']
|
||||
|
||||
def get_tool_count(self, obj):
|
||||
return obj.tools.filter(is_enabled=True).count()
|
||||
async def get_tool_count(self, obj):
|
||||
return await obj.tools.filter(is_enabled=True).acount()
|
||||
|
||||
|
||||
class ToolSerializer(serializers.ModelSerializer):
|
||||
category_name = serializers.CharField(source='category.name', read_only=True, default='')
|
||||
class ToolSerializer(ModelSerializer):
|
||||
category_name = CharField(source='category.name', read_only=True, default='')
|
||||
|
||||
class Meta:
|
||||
model = Tool
|
||||
@@ -26,10 +29,10 @@ class ToolSerializer(serializers.ModelSerializer):
|
||||
read_only_fields = ['id', 'created_at', 'updated_at']
|
||||
|
||||
|
||||
class CompressionHistorySerializer(serializers.ModelSerializer):
|
||||
original_size_display = serializers.SerializerMethodField()
|
||||
compressed_size_display = serializers.SerializerMethodField()
|
||||
created_at_display = serializers.SerializerMethodField()
|
||||
class CompressionHistorySerializer(ModelSerializer):
|
||||
original_size_display = SerializerMethodField()
|
||||
compressed_size_display = SerializerMethodField()
|
||||
created_at_display = SerializerMethodField()
|
||||
|
||||
class Meta:
|
||||
model = CompressionHistory
|
||||
@@ -41,13 +44,13 @@ class CompressionHistorySerializer(serializers.ModelSerializer):
|
||||
]
|
||||
read_only_fields = ['id', 'created_at']
|
||||
|
||||
def get_original_size_display(self, obj):
|
||||
async def get_original_size_display(self, obj):
|
||||
return self._format_size(obj.original_size)
|
||||
|
||||
def get_compressed_size_display(self, obj):
|
||||
async def get_compressed_size_display(self, obj):
|
||||
return self._format_size(obj.compressed_size)
|
||||
|
||||
def get_created_at_display(self, obj):
|
||||
async def get_created_at_display(self, obj):
|
||||
return obj.created_at.strftime('%Y-%m-%d %H:%M:%S')
|
||||
|
||||
@staticmethod
|
||||
@@ -60,29 +63,29 @@ class CompressionHistorySerializer(serializers.ModelSerializer):
|
||||
return f"{size_bytes / (1024 * 1024):.1f} MB"
|
||||
|
||||
|
||||
class ImageCompressRequestSerializer(serializers.Serializer):
|
||||
file = serializers.FileField()
|
||||
mode = serializers.ChoiceField(choices=['lossy', 'lossless'], default='lossy')
|
||||
quality = serializers.IntegerField(min_value=1, max_value=100, default=80)
|
||||
format = serializers.ChoiceField(
|
||||
class ImageCompressRequestSerializer(Serializer):
|
||||
file = FileField()
|
||||
mode = ChoiceField(choices=['lossy', 'lossless'], default='lossy')
|
||||
quality = IntegerField(min_value=1, max_value=100, default=80)
|
||||
format = ChoiceField(
|
||||
choices=['jpeg', 'png', 'webp', 'avif', 'original'],
|
||||
default='original'
|
||||
)
|
||||
keep_exif = serializers.BooleanField(default=True)
|
||||
width = serializers.IntegerField(required=False, min_value=1, max_value=10000)
|
||||
height = serializers.IntegerField(required=False, min_value=1, max_value=10000)
|
||||
maintain_aspect_ratio = serializers.BooleanField(default=True)
|
||||
keep_exif = BooleanField(default=True)
|
||||
width = IntegerField(required=False, min_value=1, max_value=10000)
|
||||
height = IntegerField(required=False, min_value=1, max_value=10000)
|
||||
maintain_aspect_ratio = BooleanField(default=True)
|
||||
|
||||
|
||||
class ColorHistorySerializer(serializers.ModelSerializer):
|
||||
class ColorHistorySerializer(ModelSerializer):
|
||||
class Meta:
|
||||
model = ColorHistory
|
||||
fields = ['id', 'color', 'created_at']
|
||||
read_only_fields = ['id', 'created_at']
|
||||
|
||||
|
||||
class ColorHistorySyncSerializer(serializers.Serializer):
|
||||
colors = serializers.ListField(
|
||||
child=serializers.CharField(max_length=7),
|
||||
class ColorHistorySyncSerializer(Serializer):
|
||||
colors = ListField(
|
||||
child=CharField(max_length=7),
|
||||
help_text='颜色HEX值列表,如 ["#FF5733", "#33FF57"]'
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user