1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| from rest_framework import serializers
from .models import Book, Publish, Author, AuthorDetail
class AuthorDetailSerializer(serializers.ModelSerializer): class Meta: model = AuthorDetail fields = '__all__' read_only_fields = ('created_at', 'updated_at')
class AuthorSerializer(serializers.ModelSerializer): au_detail = AuthorDetailSerializer(required=False, allow_null=True) au_detail_id = serializers.IntegerField( write_only=True, required=False, allow_null=True )
class Meta: model = Author fields = ['id', 'name', 'age', 'au_detail', 'au_detail_id'] extra_kwargs = { 'au_detail': {'required': False, 'allow_null': True}, }
def validate(self, data): # 确保至少提供一种形式的au_detail数据 if 'au_detail' not in data and 'au_detail_id' not in data: data['au_detail'] = None # 明确设置为None return data
def create(self, validated_data): au_detail_data = validated_data.pop('au_detail', None) au_detail_id = validated_data.pop('au_detail_id', None)
# 创建Author实例(不包含au_detail) author = Author.objects.create(**validated_data)
# 处理AuthorDetail if au_detail_data: author.au_detail = AuthorDetail.objects.create(**au_detail_data) author.save() elif au_detail_id is not None: # 明确检查是否为None author.au_detail_id = au_detail_id author.save()
return author
def update(self, instance, validated_data): au_detail_data = validated_data.pop('au_detail', None) au_detail_id = validated_data.pop('au_detail_id', None)
# 更新Author字段 for attr, value in validated_data.items(): setattr(instance, attr, value)
# 处理AuthorDetail if au_detail_data: if instance.au_detail: # 更新现有AuthorDetail detail_serializer = AuthorDetailSerializer( instance.au_detail, data=au_detail_data, partial=True ) detail_serializer.is_valid(raise_exception=True) detail_serializer.save() else: # 创建新AuthorDetail instance.au_detail = AuthorDetail.objects.create(**au_detail_data) elif au_detail_id is not None: instance.au_detail_id = au_detail_id
instance.save() return instance
class PublishSerializer(serializers.ModelSerializer): class Meta: model = Publish fields = '__all__'
class BookSerializer(serializers.ModelSerializer): publish = PublishSerializer(read_only=True) authors = AuthorSerializer(many=True, read_only=True)
# 用于写入的字段 publish_id = serializers.PrimaryKeyRelatedField( queryset=Publish.objects.all(), source='publish', write_only=True ) author_ids = serializers.PrimaryKeyRelatedField( queryset=Author.objects.all(), many=True, source='authors', write_only=True )
class Meta: model = Book fields = '__all__' extra_fields = ['publish_id', 'author_ids']
|