- Django 4.2 + DRF + JWT + GraphQL - React 18 + MobX + styled-components - PostgreSQL 数据库 - Docker + Docker Compose + Nginx - 完整的功能模块(用户、版块、文章、服务、交互、版主管理) - 完整的文档(需求、部署、测试)
117 lines
4.2 KiB
Python
117 lines
4.2 KiB
Python
from rest_framework import serializers
|
|
from .models import Comment, Rating, Like, Favorite
|
|
|
|
|
|
class CommentSerializer(serializers.ModelSerializer):
|
|
"""Serializer for Comment model."""
|
|
|
|
target_type_display = serializers.CharField(source='get_target_type_display', read_only=True)
|
|
ai_status_display = serializers.CharField(source='get_ai_status_display', read_only=True)
|
|
author_username = serializers.CharField(source='author.username', read_only=True)
|
|
|
|
class Meta:
|
|
model = Comment
|
|
fields = ('id', 'content', 'target_type', 'target_type_display', 'target_id',
|
|
'author', 'author_username', 'ai_status', 'ai_status_display',
|
|
'ai_rejection_reason', 'created_at')
|
|
read_only_fields = ('id', 'author', 'ai_status', 'ai_rejection_reason', 'created_at')
|
|
|
|
def create(self, validated_data):
|
|
validated_data['author'] = self.context['request'].user
|
|
return super().create(validated_data)
|
|
|
|
|
|
class CommentCreateSerializer(serializers.ModelSerializer):
|
|
"""Serializer for creating comments."""
|
|
|
|
class Meta:
|
|
model = Comment
|
|
fields = ('content', 'target_type', 'target_id')
|
|
|
|
def create(self, validated_data):
|
|
validated_data['author'] = self.context['request'].user
|
|
return super().create(validated_data)
|
|
|
|
|
|
class RatingSerializer(serializers.ModelSerializer):
|
|
"""Serializer for Rating model."""
|
|
|
|
target_type_display = serializers.CharField(source='get_target_type_display', read_only=True)
|
|
user_username = serializers.CharField(source='user.username', read_only=True)
|
|
|
|
class Meta:
|
|
model = Rating
|
|
fields = ('id', 'user', 'user_username', 'target_type', 'target_type_display',
|
|
'target_id', 'score', 'created_at')
|
|
read_only_fields = ('id', 'user', 'created_at')
|
|
|
|
def create(self, validated_data):
|
|
validated_data['user'] = self.context['request'].user
|
|
return super().create(validated_data)
|
|
|
|
|
|
class RatingCreateSerializer(serializers.ModelSerializer):
|
|
"""Serializer for creating/updating ratings."""
|
|
|
|
class Meta:
|
|
model = Rating
|
|
fields = ('target_type', 'target_id', 'score')
|
|
|
|
def create(self, validated_data):
|
|
validated_data['user'] = self.context['request'].user
|
|
# Check if rating already exists
|
|
Rating.objects.filter(
|
|
user=validated_data['user'],
|
|
target_type=validated_data['target_type'],
|
|
target_id=validated_data['target_id']
|
|
).delete()
|
|
return super().create(validated_data)
|
|
|
|
|
|
class LikeSerializer(serializers.ModelSerializer):
|
|
"""Serializer for Like model."""
|
|
|
|
target_type_display = serializers.CharField(source='get_target_type_display', read_only=True)
|
|
user_username = serializers.CharField(source='user.username', read_only=True)
|
|
|
|
class Meta:
|
|
model = Like
|
|
fields = ('id', 'user', 'user_username', 'target_type', 'target_type_display',
|
|
'target_id', 'created_at')
|
|
read_only_fields = ('id', 'user', 'created_at')
|
|
|
|
|
|
class FavoriteSerializer(serializers.ModelSerializer):
|
|
"""Serializer for Favorite model."""
|
|
|
|
target_type_display = serializers.CharField(source='get_target_type_display', read_only=True)
|
|
user_username = serializers.CharField(source='user.username', read_only=True)
|
|
|
|
class Meta:
|
|
model = Favorite
|
|
fields = ('id', 'user', 'user_username', 'target_type', 'target_type_display',
|
|
'target_id', 'created_at')
|
|
read_only_fields = ('id', 'user', 'created_at')
|
|
|
|
|
|
class FavoriteCreateSerializer(serializers.ModelSerializer):
|
|
"""Serializer for creating/removing favorites."""
|
|
|
|
class Meta:
|
|
model = Favorite
|
|
fields = ('target_type', 'target_id')
|
|
|
|
def create(self, validated_data):
|
|
validated_data['user'] = self.context['request'].user
|
|
# Check if favorite already exists
|
|
existing = Favorite.objects.filter(
|
|
user=validated_data['user'],
|
|
target_type=validated_data['target_type'],
|
|
target_id=validated_data['target_id']
|
|
).first()
|
|
|
|
if existing:
|
|
existing.delete()
|
|
return None # Return None to indicate removal
|
|
|
|
return super().create(validated_data) |