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
| from rest_framework import serializers
from .models import Article, Author, Group, Membership
class AuthorSerializer(serializers.ModelSerializer): name = serializers.CharField(max_length=20, required=True) mobile = serializers.CharField(max_length=11, required=True) age = serializers.IntegerField(required=False) birth_date = serializers.DateField(format="%Y-%m-%d", required=True) mod_date = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
author_articles = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta: model = Author fields = '__all__' read_only_fields = ('id', 'mod_date', 'articles')
class ArticleSerializer(serializers.ModelSerializer): title = serializers.CharField(max_length=90, required=True) body = serializers.CharField(max_length=2048, required=True) create_date = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
author = AuthorSerializer()
article_type = serializers.SerializerMethodField()
class Meta: model = Article fields = '__all__' read_only_fields = ('id', 'create_date')
def create(self, validated_data): author_data = validated_data.pop('author') author = Author.objects.create(**author_data) article = Article.objects.create(author=author, **validated_data) return article def update(self, instance, validated_data): author_data = validated_data.pop('author') author = Author.objects.create(**author_data) instance.author = author instance.save() return instance def get_article_type(self, obj): length = len(obj.body) if length > 5000: return "长篇" elif length > 1000: return "中篇" else: return '短篇' def validate_title(self, value): if len(value) < 3: raise serializers.ValidationError("Title is too short") return value def validate(self, data): if len(data['title']) > len(data['body']): raise serializers.ValidationError("Title is longer than body") return data
class GroupSerializer(serializers.ModelSerializer): name = serializers.CharField(max_length=50, required=True) members = AuthorSerializer(many=True) class Meta: model = Group fields = '__all__' read_only_fields = ('id', )
def create(self, validated_data): authors_data = validated_data.pop('members') group = Group.objects.create(**validated_data)
for author_data in authors_data: author, _ = Author.objects.get_or_create(**author_data) Membership.objects.create(group=group, author=author, inviter=author)
return group
|