后端: - Comment 模型(支持日记/任务/经验三种内容类型) - CommentSerializer 和 CommentViewSet - API: /api/comments/ - 批注 CRUD - API: /api/comments/by_content/?content_type=diary&object_id=1 - 按内容获取批注 - 日记/任务/经验序列化器嵌套显示批注 前端: - 批注样式(comments-section, comment-item) - 添加批注输入框 使用方式: - 北极星可以在任何日记/任务/经验下添加批注 - 批注会显示在内容下方 - 支持查看历史批注
54 lines
2.0 KiB
Python
Executable File
54 lines
2.0 KiB
Python
Executable File
from rest_framework import serializers
|
|
from .models import DiaryEntry, DailyProgress, Experience, Task, Comment
|
|
|
|
class CommentSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = Comment
|
|
fields = '__all__'
|
|
read_only_fields = ['created_at']
|
|
|
|
class ExperienceSerializer(serializers.ModelSerializer):
|
|
category_display = serializers.CharField(source='get_category_display', read_only=True)
|
|
comments = CommentSerializer(many=True, read_only=True, source='comment_set')
|
|
|
|
class Meta:
|
|
model = Experience
|
|
fields = '__all__'
|
|
|
|
class DailyProgressSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = DailyProgress
|
|
fields = '__all__'
|
|
|
|
class TaskSimpleSerializer(serializers.ModelSerializer):
|
|
status_display = serializers.CharField(source='get_status_display', read_only=True)
|
|
|
|
class Meta:
|
|
model = Task
|
|
fields = ['id', 'title', 'status', 'status_display', 'progress_percent']
|
|
|
|
class DiaryEntrySerializer(serializers.ModelSerializer):
|
|
progresses = DailyProgressSerializer(many=True, read_only=True)
|
|
linked_tasks = TaskSimpleSerializer(many=True, read_only=True)
|
|
experiences = ExperienceSerializer(many=True, read_only=True)
|
|
comments = CommentSerializer(many=True, read_only=True, source='comment_set')
|
|
|
|
class Meta:
|
|
model = DiaryEntry
|
|
fields = '__all__'
|
|
|
|
class TaskSerializer(serializers.ModelSerializer):
|
|
status_display = serializers.CharField(source='get_status_display', read_only=True)
|
|
priority_display = serializers.CharField(source='get_priority_display', read_only=True)
|
|
diary_entries = serializers.SerializerMethodField()
|
|
comments = CommentSerializer(many=True, read_only=True, source='comment_set')
|
|
|
|
def get_diary_entries(self, obj):
|
|
entries = obj.diary_entries.all()[:5]
|
|
return DiaryEntrySerializer(entries, many=True).data
|
|
|
|
class Meta:
|
|
model = Task
|
|
fields = '__all__'
|
|
read_only_fields = ['completed_at', 'created_at', 'updated_at']
|