views.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from rest_framework import generics, status, permissions, viewsets # 确保 viewsets 导入
  2. from rest_framework.decorators import action # 如果有自定义action,虽然这里目前没有用到
  3. from rest_framework.response import Response
  4. from rest_framework_simplejwt.tokens import RefreshToken
  5. from django.db.models import Count, Q # 确保 Q 和 Count 导入
  6. from .models import CustomUser, InterestTag # <<<< 导入 InterestTag 和 CustomUser
  7. from .serializers import (
  8. UserRegistrationSerializer,
  9. UserProfileSerializer,
  10. InterestTagSerializer, # <<<< 导入 InterestTagSerializer
  11. RecommendedUserSerializer # <<<< 导入 RecommendedUserSerializer
  12. )
  13. class UserRegistrationView(generics.CreateAPIView):
  14. queryset = CustomUser.objects.all()
  15. serializer_class = UserRegistrationSerializer
  16. permission_classes = [permissions.AllowAny]
  17. def create(self, request, *args, **kwargs):
  18. serializer = self.get_serializer(data=request.data)
  19. serializer.is_valid(raise_exception=True)
  20. user = serializer.save()
  21. refresh = RefreshToken.for_user(user)
  22. user_data = UserProfileSerializer(user, context={'request': request}).data
  23. response_data = {
  24. 'refresh': str(refresh),
  25. 'access': str(refresh.access_token),
  26. 'user': user_data
  27. }
  28. return Response(response_data, status=status.HTTP_201_CREATED)
  29. class UserProfileView(generics.RetrieveUpdateAPIView):
  30. queryset = CustomUser.objects.all()
  31. serializer_class = UserProfileSerializer
  32. permission_classes = [permissions.IsAuthenticated]
  33. def get_object(self):
  34. return self.request.user
  35. # --- 从 groups/views.py 移动过来的 ---
  36. class InterestTagViewSet(viewsets.ReadOnlyModelViewSet): # 应该在 accounts/views.py
  37. """
  38. 一个只读的ViewSet,用于查看兴趣标签列表和详情。
  39. """
  40. queryset = InterestTag.objects.all().order_by('name') # InterestTag 现在已导入
  41. serializer_class = InterestTagSerializer # InterestTagSerializer 现在已导入
  42. permission_classes = [permissions.AllowAny]
  43. class RecommendedUserListView(generics.ListAPIView): # 应该在 accounts/views.py
  44. """
  45. 获取与当前登录用户有共同兴趣的推荐用户列表。
  46. """
  47. serializer_class = RecommendedUserSerializer # RecommendedUserSerializer 现在已导入
  48. permission_classes = [permissions.IsAuthenticated]
  49. def get_queryset(self):
  50. current_user = self.request.user # CustomUser 现在已导入
  51. current_user_interest_ids = list(current_user.interests.values_list('id', flat=True))
  52. if not current_user_interest_ids:
  53. return CustomUser.objects.none()
  54. recommended_users = CustomUser.objects.filter(
  55. interests__id__in=current_user_interest_ids
  56. ).exclude(
  57. id=current_user.id
  58. ).distinct()
  59. recommended_users = recommended_users.annotate(
  60. common_interest_count=Count(
  61. 'interests',
  62. filter=Q(interests__id__in=current_user_interest_ids)
  63. )
  64. ).order_by('-common_interest_count', '?')
  65. current_user_interests_set = set(current_user.interests.all())
  66. for user_obj in recommended_users:
  67. user_interests_set = set(user_obj.interests.all())
  68. common_tags = list(current_user_interests_set.intersection(user_interests_set))
  69. user_obj.common_interests_list = common_tags
  70. return recommended_users