100 lines
3.1 KiB
Python
100 lines
3.1 KiB
Python
#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) |