This commit is contained in:
jeremygan2021
2026-02-12 15:02:53 +08:00
parent b4ac97c3c2
commit 9e81eaaaab
23 changed files with 844 additions and 104 deletions

View File

@@ -1,5 +1,5 @@
from rest_framework import serializers
from .models import Activity, ActivitySignup, Topic, Reply, TopicMedia
from .models import Activity, ActivitySignup, Topic, Reply, TopicMedia, Announcement
from shop.serializers import WeChatUserSerializer, ESP32ConfigSerializer, ServiceSerializer, VCCourseSerializer
class ActivitySerializer(serializers.ModelSerializer):
@@ -16,9 +16,16 @@ class ActivitySignupSerializer(serializers.ModelSerializer):
read_only_fields = ['signup_time', 'status']
class TopicMediaSerializer(serializers.ModelSerializer):
url = serializers.SerializerMethodField()
class Meta:
model = TopicMedia
fields = ['id', 'file', 'media_type', 'created_at']
fields = ['id', 'file', 'file_url', 'url', 'media_type', 'created_at']
def get_url(self, obj):
if obj.file:
return obj.file.url
return obj.file_url
class ReplySerializer(serializers.ModelSerializer):
author_info = WeChatUserSerializer(source='author', read_only=True)
@@ -27,6 +34,7 @@ class ReplySerializer(serializers.ModelSerializer):
class Meta:
model = Reply
fields = ['id', 'topic', 'content', 'author', 'author_info', 'reply_to', 'media', 'created_at']
read_only_fields = ['author', 'created_at']
class TopicSerializer(serializers.ModelSerializer):
author_info = WeChatUserSerializer(source='author', read_only=True)
@@ -38,6 +46,12 @@ class TopicSerializer(serializers.ModelSerializer):
service_info = ServiceSerializer(source='related_service', read_only=True)
course_info = VCCourseSerializer(source='related_course', read_only=True)
media_ids = serializers.ListField(
child=serializers.IntegerField(),
write_only=True,
required=False
)
class Meta:
model = Topic
fields = [
@@ -46,6 +60,20 @@ class TopicSerializer(serializers.ModelSerializer):
'related_service', 'service_info',
'related_course', 'course_info',
'view_count', 'is_pinned', 'created_at', 'updated_at',
'is_verified_owner', 'replies', 'media'
'is_verified_owner', 'replies', 'media', 'media_ids'
]
read_only_fields = ['view_count', 'created_at', 'updated_at', 'is_verified_owner']
read_only_fields = ['author', 'view_count', 'created_at', 'updated_at', 'is_verified_owner']
def create(self, validated_data):
media_ids = validated_data.pop('media_ids', [])
topic = super().create(validated_data)
if media_ids:
TopicMedia.objects.filter(id__in=media_ids).update(topic=topic)
return topic
class AnnouncementSerializer(serializers.ModelSerializer):
display_image_url = serializers.ReadOnlyField()
class Meta:
model = Announcement
fields = '__all__'