#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() location = 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_location(self, obj): """ 获取完整的图书URL """ if obj.location: # 检查location是否已经是完整的URL if obj.location.startswith(('http://', 'https://')): return obj.location # 否则添加MEDIA_URL前缀 return settings.API_URL + obj.location 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)