From caff3d95a720e1a2db123a1726d9c6046b2be544 Mon Sep 17 00:00:00 2001 From: hl <1163399601@qq.com> Date: Sat, 28 May 2022 02:47:32 +0800 Subject: [PATCH 1/7] style(add "favorite-manage/": "http://127.0.0.1:8000/favorite-manage/" ): --- index.py | 1 + 1 file changed, 1 insertion(+) diff --git a/index.py b/index.py index d286089..1ad7946 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/', }) -- Gitee From 4ad6862b9a5042597f05129d130f7c611e8c4a4a Mon Sep 17 00:00:00 2001 From: hl <1163399601@qq.com> Date: Sat, 28 May 2022 02:48:35 +0800 Subject: [PATCH 2/7] style(add "favorite-manage/": "http://127.0.0.1:8000/favorite-manage/"): --- favorite/urls.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/favorite/urls.py b/favorite/urls.py index fb16bef..c32ee47 100644 --- a/favorite/urls.py +++ b/favorite/urls.py @@ -9,9 +9,7 @@ favorite_api_router.register('favorite-folder', favorite_api.UserFavoriteFolderViewSet, basename='favorite-folder') -favorite_api_router.register('favorite', - favorite_api.UserFavoriteViewSet, - basename='favorite') + urlpatterns = [ path('', include((favorite_api_router.urls, 'favorite'), namespace='favorite')) ] -- Gitee From 2e3d5aa44170d4ec1b996bae3f1edce46971d06e Mon Sep 17 00:00:00 2001 From: hl <1163399601@qq.com> Date: Sat, 28 May 2022 02:49:37 +0800 Subject: [PATCH 3/7] style(change var name): --- favorite/models.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/favorite/models.py b/favorite/models.py index 14eefc7..4428076 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, -- Gitee From aa9a79860f4e17e20240ffd0a4bd0f7f1da34670 Mon Sep 17 00:00:00 2001 From: hl <1163399601@qq.com> Date: Sat, 28 May 2022 02:51:36 +0800 Subject: [PATCH 4/7] feat(add favorite0.1): --- favorite/serializers.py | 102 ++++++++++++++++++++++++++++----- favorite/views/favorite_api.py | 41 ++++++++++--- 2 files changed, 120 insertions(+), 23 deletions(-) diff --git a/favorite/serializers.py b/favorite/serializers.py index b379509..adedae6 100644 --- a/favorite/serializers.py +++ b/favorite/serializers.py @@ -1,6 +1,7 @@ import os from collections import OrderedDict -from rest_framework import serializers +from rest_framework import serializers, status +from rest_framework.response import Response from favorite.models import UserFavorite, UserFavoriteFolder from posts.models import Post @@ -13,29 +14,70 @@ else: prefix = 'http://127.0.0.1:8000/' +class UserFavoritePostSerializer(serializers.ModelSerializer): + """文章序列化器, 讲文章id修改为url""" + title = serializers.CharField(read_only=True) + + class Meta: + model = Post + fields = ['id', 'title'] + + def to_representation(self, instance): + res = super().to_representation(instance=instance) + res['url'] = prefix + 'post-manage/posts/' + str(res['id']) + '/' + del res['id'] + return res + + class UserFavoriteSerializer(serializers.ModelSerializer): - class UserFavoritePostSerializer(serializers.ModelSerializer): - title = serializers.CharField(read_only=True) + """给收藏文件夹添加文章""" - class Meta: - model = Post - fields = ['id', 'title'] + user_id = serializers.PrimaryKeyRelatedField( + queryset=UserInfo.objects.all(), + source='user', + write_only=True, + help_text='用户id' + ) - def to_representation(self, instance): - res = super().to_representation(instance=instance) - res['url'] = prefix + 'post-manage/posts/' + str(res['id']) + '/' - del res['id'] - return res + folder_id = serializers.PrimaryKeyRelatedField( + queryset=UserFavoriteFolder.objects.all(), + write_only=True, + help_text='收藏夹id' + ) - post = UserFavoritePostSerializer(many=False) + post_id = serializers.PrimaryKeyRelatedField( + queryset=Post.objects.all(), + source='Post', + write_only=True, + help_text='帖子id' + ) + folder = serializers.StringRelatedField() + post = UserFavoritePostSerializer(required=False) class Meta: model = UserFavorite - fields = ['post'] + fields = ['id', 'user_id', 'folder', 'folder_id', 'post_id', 'post'] + + def create(self, validated_data): + """创建文章""" + data = self.context['request'].data + post_id = data['post_id'] + folder_id = data['folder_id'] + + instance = UserFavorite.objects.create(post_id=post_id, folder_id=folder_id) + return instance class UserFavoriteFoldSerializer(serializers.ModelSerializer): - favorite_set = UserFavoriteSerializer(many=True, read_only=True) + """新增收藏夹""" + + def to_representation(self, instance): + """修改收藏夹id为url""" + res = super().to_representation(instance=instance) + res['folder_url'] = prefix + 'favorite-manage/favorite-folder/' + str(res['id']) + '/' + del res['id'] + return res + user_id = serializers.PrimaryKeyRelatedField( queryset=UserInfo.objects.all(), source='user', @@ -45,4 +87,34 @@ class UserFavoriteFoldSerializer(serializers.ModelSerializer): class Meta: model = UserFavoriteFolder - fields = ['folder_name', 'favorite_set', 'user_id'] + fields = ['id', 'folder_name', 'user_id'] + + def validate_folder_name(self, value): + """ + 判断收藏夹是否重复 + 判断收藏夹数量是否超过数量 + """ + 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 UserFavoriteFoldDetailSerializer(serializers.ModelSerializer): + """ + 显示一个收藏夹的所有文章 + 删除, 修改收藏夹文件名 + """ + + favorite_set = UserFavoriteSerializer(many=True, read_only=True) + + class Meta: + model = UserFavoriteFolder + fields = ['id', 'folder_name', 'favorite_set'] diff --git a/favorite/views/favorite_api.py b/favorite/views/favorite_api.py index db9c8f4..827c3b1 100644 --- a/favorite/views/favorite_api.py +++ b/favorite/views/favorite_api.py @@ -1,15 +1,41 @@ from django_filters import OrderingFilter from django_filters.rest_framework import DjangoFilterBackend +from rest_framework import status +from rest_framework.decorators import action 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 UserFavoriteSerializer, UserFavoriteFoldSerializer, UserFavoriteFoldDetailSerializer class UserFavoriteFolderViewSet(ModelViewSet): + @action(methods=['POST', 'DELETE'], detail=True) + def post(self, request, pk): + """ + 通过API接口/favorite-manage/favorite-folder/pk/add_post/ + 给当前文章收藏夹添加帖子 + """ + queryset = UserFavorite.objects.all() + folder_id = self.get_object().id + + data = request.data + post_id = data['post_id'] + + if request.method == 'POST': + UserFavorite.objects.create(folder_id=folder_id, post_id=post_id) + elif request.method == 'DELETE': + try: + UserFavorite.objects.get(folder_id=folder_id, post_id=post_id).delete() + except UserFavorite.DoesNotExist: + return Response({'msg': '404'}, status=status.HTTP_404_NOT_FOUND) + + serializer = UserFavoriteSerializer(instance=queryset) + + return Response(serializer.data) + def list(self, request, *args, **kwargs): """ 此接口仅能获取关于自己的信息 @@ -25,12 +51,11 @@ class UserFavoriteFolderViewSet(ModelViewSet): serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) - queryset = UserFavoriteFolder.objects.all().order_by('create_at') - serializer_class = UserFavoriteFoldSerializer - permission_classes = [IsAuthenticated] - + def get_serializer_class(self): + if self.action == 'retrieve': + return UserFavoriteFoldDetailSerializer + return super().get_serializer_class() -class UserFavoriteViewSet(ModelViewSet): - queryset = UserFavorite.objects.all() - serializer_class = UserFavoriteSerializer + queryset = UserFavoriteFolder.objects.all().order_by('-create_at') + serializer_class = UserFavoriteFoldSerializer permission_classes = [IsAuthenticated] -- Gitee From 80418c9d38c8cad2cff2e8a33ae8b5a14da1f763 Mon Sep 17 00:00:00 2001 From: hl <1163399601@qq.com> Date: Sat, 28 May 2022 14:59:50 +0800 Subject: [PATCH 5/7] feat(add favorite): add favorite add favorite --- favorite/serializers.py | 102 +++++++++++++++++---------------- favorite/urls.py | 3 + favorite/views/favorite_api.py | 52 ++++++++--------- 3 files changed, 79 insertions(+), 78 deletions(-) diff --git a/favorite/serializers.py b/favorite/serializers.py index adedae6..f037249 100644 --- a/favorite/serializers.py +++ b/favorite/serializers.py @@ -1,72 +1,48 @@ -import os -from collections import OrderedDict -from rest_framework import serializers, status -from rest_framework.response import Response +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 UserFavoritePostSerializer(serializers.ModelSerializer): - """文章序列化器, 讲文章id修改为url""" - title = serializers.CharField(read_only=True) - - class Meta: - model = Post - fields = ['id', 'title'] - - def to_representation(self, instance): - res = super().to_representation(instance=instance) - res['url'] = prefix + 'post-manage/posts/' + str(res['id']) + '/' - del res['id'] - return res - - -class UserFavoriteSerializer(serializers.ModelSerializer): - """给收藏文件夹添加文章""" - - user_id = serializers.PrimaryKeyRelatedField( - queryset=UserInfo.objects.all(), - source='user', - write_only=True, - help_text='用户id' - ) - - folder_id = serializers.PrimaryKeyRelatedField( + folder = serializers.PrimaryKeyRelatedField( queryset=UserFavoriteFolder.objects.all(), + source='UserFavoriteFolder', write_only=True, help_text='收藏夹id' ) - post_id = serializers.PrimaryKeyRelatedField( + post = serializers.PrimaryKeyRelatedField( queryset=Post.objects.all(), source='Post', write_only=True, help_text='帖子id' ) - folder = serializers.StringRelatedField() - post = UserFavoritePostSerializer(required=False) - - class Meta: - model = UserFavorite - fields = ['id', 'user_id', 'folder', 'folder_id', 'post_id', 'post'] def create(self, validated_data): - """创建文章""" - data = self.context['request'].data - post_id = data['post_id'] - folder_id = data['folder_id'] + # 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 = UserFavorite.objects.create(post_id=post_id, folder_id=folder_id) return instance + class Meta: + model = UserFavorite + fields = ['id', 'folder', 'post'] + class UserFavoriteFoldSerializer(serializers.ModelSerializer): """新增收藏夹""" @@ -74,7 +50,7 @@ class UserFavoriteFoldSerializer(serializers.ModelSerializer): def to_representation(self, instance): """修改收藏夹id为url""" res = super().to_representation(instance=instance) - res['folder_url'] = prefix + 'favorite-manage/favorite-folder/' + str(res['id']) + '/' + res['suffix'] = 'post-manage/favorite-folder/' + str(res['id']) + '/' del res['id'] return res @@ -91,9 +67,14 @@ class UserFavoriteFoldSerializer(serializers.ModelSerializer): 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) @@ -107,13 +88,36 @@ class UserFavoriteFoldSerializer(serializers.ModelSerializer): return value +class UserFavoriteBaseSerializer(serializers.ModelSerializer): + """帖子序列化器""" + class UserFavoritePostSerializer(serializers.ModelSerializer): + """将文章id修改为url""" + title = serializers.CharField(read_only=True) + + class Meta: + model = Post + fields = ['id', 'title'] + + def to_representation(self, instance): + res = super().to_representation(instance=instance) + res['suffix'] = 'post-manage/posts/' + str(res['id']) + '/' + del res['id'] + return res + + post = UserFavoritePostSerializer(required=False) + + class Meta: + model = UserFavorite + fields = ['id', 'post'] + + class UserFavoriteFoldDetailSerializer(serializers.ModelSerializer): """ 显示一个收藏夹的所有文章 删除, 修改收藏夹文件名 """ - favorite_set = UserFavoriteSerializer(many=True, read_only=True) + favorite_set = UserFavoriteBaseSerializer(many=True, read_only=True) class Meta: model = UserFavoriteFolder diff --git a/favorite/urls.py b/favorite/urls.py index c32ee47..5ffebbb 100644 --- a/favorite/urls.py +++ b/favorite/urls.py @@ -9,6 +9,9 @@ favorite_api_router.register('favorite-folder', favorite_api.UserFavoriteFolderViewSet, basename='favorite-folder') +favorite_api_router.register('favorite', + favorite_api.UserFavoriteViewSet, + basename='favorite') urlpatterns = [ path('', include((favorite_api_router.urls, 'favorite'), namespace='favorite')) diff --git a/favorite/views/favorite_api.py b/favorite/views/favorite_api.py index 827c3b1..8f707d0 100644 --- a/favorite/views/favorite_api.py +++ b/favorite/views/favorite_api.py @@ -1,41 +1,14 @@ -from django_filters import OrderingFilter -from django_filters.rest_framework import DjangoFilterBackend -from rest_framework import status -from rest_framework.decorators import action 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, UserFavoriteFoldDetailSerializer +from favorite.serializers import UserFavoriteFoldSerializer, UserFavoriteFoldDetailSerializer, \ + UserFavoriteFoldAddSerializer class UserFavoriteFolderViewSet(ModelViewSet): - @action(methods=['POST', 'DELETE'], detail=True) - def post(self, request, pk): - """ - 通过API接口/favorite-manage/favorite-folder/pk/add_post/ - 给当前文章收藏夹添加帖子 - """ - queryset = UserFavorite.objects.all() - folder_id = self.get_object().id - - data = request.data - post_id = data['post_id'] - - if request.method == 'POST': - UserFavorite.objects.create(folder_id=folder_id, post_id=post_id) - elif request.method == 'DELETE': - try: - UserFavorite.objects.get(folder_id=folder_id, post_id=post_id).delete() - except UserFavorite.DoesNotExist: - return Response({'msg': '404'}, status=status.HTTP_404_NOT_FOUND) - - serializer = UserFavoriteSerializer(instance=queryset) - - return Response(serializer.data) - def list(self, request, *args, **kwargs): """ 此接口仅能获取关于自己的信息 @@ -59,3 +32,24 @@ class UserFavoriteFolderViewSet(ModelViewSet): queryset = UserFavoriteFolder.objects.all().order_by('-create_at') serializer_class = UserFavoriteFoldSerializer permission_classes = [IsAuthenticated] + + +class UserFavoriteViewSet(ModelViewSet): + """添加文章""" + 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) -- Gitee From 45c58c2c88be00ce9229a94248166e6a2e6ab05b Mon Sep 17 00:00:00 2001 From: hl <1163399601@qq.com> Date: Sat, 28 May 2022 15:40:01 +0800 Subject: [PATCH 6/7] fix(serializers): fix bug Changed serialization without saving --- favorite/serializers.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/favorite/serializers.py b/favorite/serializers.py index f037249..fb4df1e 100644 --- a/favorite/serializers.py +++ b/favorite/serializers.py @@ -36,6 +36,7 @@ class UserFavoriteFoldAddSerializer(serializers.ModelSerializer): raise ValidationError('当前文件夹下有相同的收藏了') instance = UserFavorite.objects.create(folder_id=folder_id, post_id=post_id) + instance.save() return instance @@ -47,13 +48,6 @@ class UserFavoriteFoldAddSerializer(serializers.ModelSerializer): class UserFavoriteFoldSerializer(serializers.ModelSerializer): """新增收藏夹""" - def to_representation(self, instance): - """修改收藏夹id为url""" - res = super().to_representation(instance=instance) - res['suffix'] = 'post-manage/favorite-folder/' + str(res['id']) + '/' - del res['id'] - return res - user_id = serializers.PrimaryKeyRelatedField( queryset=UserInfo.objects.all(), source='user', -- Gitee From 855f5587717d876e81750aa73160a175e9201062 Mon Sep 17 00:00:00 2001 From: hl <1163399601@qq.com> Date: Sat, 28 May 2022 15:41:32 +0800 Subject: [PATCH 7/7] style(user): Delete the blank space add favorite --- favorite/urls.py | 1 - 1 file changed, 1 deletion(-) diff --git a/favorite/urls.py b/favorite/urls.py index 5ffebbb..fb16bef 100644 --- a/favorite/urls.py +++ b/favorite/urls.py @@ -12,7 +12,6 @@ favorite_api_router.register('favorite-folder', favorite_api_router.register('favorite', favorite_api.UserFavoriteViewSet, basename='favorite') - urlpatterns = [ path('', include((favorite_api_router.urls, 'favorite'), namespace='favorite')) ] -- Gitee