Files
chengshishouce/backend/apps/interactions/serializers.py
mashen c866e74ece Initial commit: React + Django 城市手册项目
- Django 4.2 + DRF + JWT + GraphQL
- React 18 + MobX + styled-components
- PostgreSQL 数据库
- Docker + Docker Compose + Nginx
- 完整的功能模块(用户、版块、文章、服务、交互、版主管理)
- 完整的文档(需求、部署、测试)
2026-04-09 13:56:02 +00:00

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)