diff --git a/favorite/models.py b/favorite/models.py index 14eefc7d86265f7e9593a8ed2c89b94f7627c76d..44280768c8eaf31bae19023b222031cb0bf4f6ff 100644 --- a/favorite/models.py +++ b/favorite/models.py @@ -1,5 +1,5 @@ from django.db import models -from posts.models import Post as post +from posts.models import Post from users.models import UserInfo @@ -23,13 +23,14 @@ class UserFavoriteFolder(models.Model): class UserFavorite(models.Model): + """中间表, 对应的是收藏夹和帖子多对多的关系""" folder = models.ForeignKey(UserFavoriteFolder, related_name='favorite_set', null=False, on_delete=models.CASCADE, verbose_name='所关联的文件夹') - post = models.ForeignKey(post, + post = models.ForeignKey(Post, related_name='related_favorite', null=False, on_delete=models.CASCADE, diff --git a/favorite/serializers.py b/favorite/serializers.py index b379509cf9239ec616618cc23ca272ccec32337e..fb4df1e4133fa89ecb72d21739c9fad2a9860a23 100644 --- a/favorite/serializers.py +++ b/favorite/serializers.py @@ -1,20 +1,91 @@ -import os -from collections import OrderedDict from rest_framework import serializers +from rest_framework.exceptions import ValidationError from favorite.models import UserFavorite, UserFavoriteFolder from posts.models import Post from users.models import UserInfo -ENV_DEFINE = os.getenv('position') -if ENV_DEFINE == 'online': - prefix = 'https://www.qiusuo-mc.cn/' -else: - prefix = 'http://127.0.0.1:8000/' +class UserFavoriteFoldAddSerializer(serializers.ModelSerializer): + """给收藏夹添加帖子""" -class UserFavoriteSerializer(serializers.ModelSerializer): + folder = serializers.PrimaryKeyRelatedField( + queryset=UserFavoriteFolder.objects.all(), + source='UserFavoriteFolder', + write_only=True, + help_text='收藏夹id' + ) + + post = serializers.PrimaryKeyRelatedField( + queryset=Post.objects.all(), + source='Post', + write_only=True, + help_text='帖子id' + ) + + def create(self, validated_data): + # print(validated_data['folder']) + + folder_id = validated_data['UserFavoriteFolder'].id + post_id = validated_data['Post'].id + + post_set = UserFavorite.objects.all().filter(folder_id=folder_id) + for i in post_set: + print(i) + if post_id == i.post_id: + raise ValidationError('当前文件夹下有相同的收藏了') + + instance = UserFavorite.objects.create(folder_id=folder_id, post_id=post_id) + instance.save() + + return instance + + class Meta: + model = UserFavorite + fields = ['id', 'folder', 'post'] + + +class UserFavoriteFoldSerializer(serializers.ModelSerializer): + """新增收藏夹""" + + user_id = serializers.PrimaryKeyRelatedField( + queryset=UserInfo.objects.all(), + source='user', + write_only=True, + help_text='用户id' + ) + + class Meta: + model = UserFavoriteFolder + fields = ['id', 'folder_name', 'user_id'] + + def validate_folder_name(self, value): + """ + 判断文件夹名是否为null + 判断收藏夹是否重复 + 判断收藏夹数量是否超过数量 + """ + + if value is None: + raise serializers.ValidationError('文件夹名不能为空') + + user_id = self.context['request'].data['user_id'] # 获取当前添加收藏夹用户的id + query_set = UserFavoriteFolder.objects.filter(user=user_id) + + count = query_set.count() + if count >= 100: + raise serializers.ValidationError('收藏夹数量超过上限') + + folder_count = query_set.filter(folder_name=value).count() + if folder_count >= 1: + raise serializers.ValidationError('收藏夹已存在') + return value + + +class UserFavoriteBaseSerializer(serializers.ModelSerializer): + """帖子序列化器""" class UserFavoritePostSerializer(serializers.ModelSerializer): + """将文章id修改为url""" title = serializers.CharField(read_only=True) class Meta: @@ -23,26 +94,25 @@ class UserFavoriteSerializer(serializers.ModelSerializer): def to_representation(self, instance): res = super().to_representation(instance=instance) - res['url'] = prefix + 'post-manage/posts/' + str(res['id']) + '/' + res['suffix'] = 'post-manage/posts/' + str(res['id']) + '/' del res['id'] return res - post = UserFavoritePostSerializer(many=False) + post = UserFavoritePostSerializer(required=False) class Meta: model = UserFavorite - fields = ['post'] + fields = ['id', 'post'] -class UserFavoriteFoldSerializer(serializers.ModelSerializer): - favorite_set = UserFavoriteSerializer(many=True, read_only=True) - user_id = serializers.PrimaryKeyRelatedField( - queryset=UserInfo.objects.all(), - source='user', - write_only=True, - help_text='用户id' - ) +class UserFavoriteFoldDetailSerializer(serializers.ModelSerializer): + """ + 显示一个收藏夹的所有文章 + 删除, 修改收藏夹文件名 + """ + + favorite_set = UserFavoriteBaseSerializer(many=True, read_only=True) class Meta: model = UserFavoriteFolder - fields = ['folder_name', 'favorite_set', 'user_id'] + fields = ['id', 'folder_name', 'favorite_set'] diff --git a/favorite/views/favorite_api.py b/favorite/views/favorite_api.py index db9c8f4942fea082883fd3a41727681fb05da638..8f707d0cff44970a0b09f89a4a7a9588193d28e7 100644 --- a/favorite/views/favorite_api.py +++ b/favorite/views/favorite_api.py @@ -1,11 +1,10 @@ -from django_filters import OrderingFilter -from django_filters.rest_framework import DjangoFilterBackend from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet from favorite.models import UserFavorite, UserFavoriteFolder -from favorite.serializers import UserFavoriteSerializer, UserFavoriteFoldSerializer +from favorite.serializers import UserFavoriteFoldSerializer, UserFavoriteFoldDetailSerializer, \ + UserFavoriteFoldAddSerializer class UserFavoriteFolderViewSet(ModelViewSet): @@ -25,12 +24,32 @@ class UserFavoriteFolderViewSet(ModelViewSet): serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) - queryset = UserFavoriteFolder.objects.all().order_by('create_at') + def get_serializer_class(self): + if self.action == 'retrieve': + return UserFavoriteFoldDetailSerializer + return super().get_serializer_class() + + queryset = UserFavoriteFolder.objects.all().order_by('-create_at') serializer_class = UserFavoriteFoldSerializer permission_classes = [IsAuthenticated] class UserFavoriteViewSet(ModelViewSet): - queryset = UserFavorite.objects.all() - serializer_class = UserFavoriteSerializer + """添加文章""" + queryset = UserFavoriteFolder.objects.all().order_by('-create_at') + serializer_class = UserFavoriteFoldAddSerializer permission_classes = [IsAuthenticated] + + def list(self, request, *args, **kwargs): + """ + 此接口仅能获取关于自己的信息 + """ + queryset = self.filter_queryset(self.get_queryset()) + if not request.user.is_superuser: + queryset = queryset.filter(user=request.user.id) + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) diff --git a/index.py b/index.py index d2860896bc24975f51c9e4430b503a0d570baf8b..1ad7946558833a6c5c87c9513771f008dc999e8e 100644 --- a/index.py +++ b/index.py @@ -25,4 +25,5 @@ def root(request): 'passage': prefix + 'passage/', 'tag': prefix + 'tag/', 'scratch': prefix + 'scratch/', + 'favorite-manage/': prefix + 'favorite-manage/', })