django-vue3-admin-backend/crud_book/serializers.py
2025-11-02 13:25:50 +08:00

100 lines
3.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#backend/crud_demo/serializers.py
from crud_book.models import CrudBookModel, ReadingProgress
from dvadmin.utils.serializers import CustomModelSerializer
from rest_framework import serializers
from django.conf import settings
class CrudBookModelSerializer(CustomModelSerializer):
"""
序列化器
"""
# 添加SerializerMethodField来处理image字段
image = serializers.SerializerMethodField()
file = serializers.SerializerMethodField()
def get_image(self, obj):
"""
获取完整的图片URL
"""
if obj.image:
# 检查image是否已经是完整的URL
if obj.image.startswith(('http://', 'https://')):
return obj.image
# 否则添加MEDIA_URL前缀
return settings.API_URL + obj.image
return None
def get_file(self, obj):
"""
获取完整的文件URL
"""
if obj.file:
# 文件字段返回完整URL
request = self.context.get('request')
if request:
return request.build_absolute_uri(obj.file.url)
return settings.API_URL + obj.file.url
return None
#这里是进行了序列化模型及所有的字段
class Meta:
model = CrudBookModel
fields = "__all__"
#这里是创建/更新时的列化器
class CrudBookModelCreateUpdateSerializer(CustomModelSerializer):
"""
创建/更新时的列化器
"""
class Meta:
model = CrudBookModel
fields = '__all__'
class ReadingProgressSerializer(CustomModelSerializer):
"""
阅读进度序列化器
"""
# 添加book_id字段便于前端传递和接收
book_id = serializers.IntegerField(write_only=True, required=True)
class Meta:
model = ReadingProgress
fields = '__all__'
read_only_fields = ('user', 'book') # 将book设为只读使用book_id进行设置
def validate_book_id(self, value):
"""验证book_id对应的图书是否存在"""
try:
CrudBookModel.objects.get(id=value)
return value
except CrudBookModel.DoesNotExist:
raise serializers.ValidationError(f'ID为{value}的图书不存在')
def create(self, validated_data):
"""创建阅读进度记录"""
# 获取book_id并删除因为我们需要用它查找book对象
book_id = validated_data.pop('book_id')
# 查找对应的book对象
book = CrudBookModel.objects.get(id=book_id)
# 创建记录设置user和book
validated_data['user'] = self.context['request'].user
validated_data['book'] = book
return super().create(validated_data)
def update(self, instance, validated_data):
"""更新阅读进度记录"""
# 如果提供了book_id则验证并更新book
if 'book_id' in validated_data:
book_id = validated_data.pop('book_id')
book = CrudBookModel.objects.get(id=book_id)
validated_data['book'] = book
return super().update(instance, validated_data)