1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- from rest_framework import generics, status, permissions, viewsets # 确保 viewsets 导入
- from rest_framework.decorators import action # 如果有自定义action,虽然这里目前没有用到
- from rest_framework.response import Response
- from rest_framework_simplejwt.tokens import RefreshToken
- from django.db.models import Count, Q # 确保 Q 和 Count 导入
- from .models import CustomUser, InterestTag # <<<< 导入 InterestTag 和 CustomUser
- from .serializers import (
- UserRegistrationSerializer,
- UserProfileSerializer,
- InterestTagSerializer, # <<<< 导入 InterestTagSerializer
- RecommendedUserSerializer # <<<< 导入 RecommendedUserSerializer
- )
- class UserRegistrationView(generics.CreateAPIView):
- queryset = CustomUser.objects.all()
- serializer_class = UserRegistrationSerializer
- permission_classes = [permissions.AllowAny]
- def create(self, request, *args, **kwargs):
- serializer = self.get_serializer(data=request.data)
- serializer.is_valid(raise_exception=True)
- user = serializer.save()
- refresh = RefreshToken.for_user(user)
- user_data = UserProfileSerializer(user, context={'request': request}).data
- response_data = {
- 'refresh': str(refresh),
- 'access': str(refresh.access_token),
- 'user': user_data
- }
- return Response(response_data, status=status.HTTP_201_CREATED)
- class UserProfileView(generics.RetrieveUpdateAPIView):
- queryset = CustomUser.objects.all()
- serializer_class = UserProfileSerializer
- permission_classes = [permissions.IsAuthenticated]
- def get_object(self):
- return self.request.user
- # --- 从 groups/views.py 移动过来的 ---
- class InterestTagViewSet(viewsets.ReadOnlyModelViewSet): # 应该在 accounts/views.py
- """
- 一个只读的ViewSet,用于查看兴趣标签列表和详情。
- """
- queryset = InterestTag.objects.all().order_by('name') # InterestTag 现在已导入
- serializer_class = InterestTagSerializer # InterestTagSerializer 现在已导入
- permission_classes = [permissions.AllowAny]
- class RecommendedUserListView(generics.ListAPIView): # 应该在 accounts/views.py
- """
- 获取与当前登录用户有共同兴趣的推荐用户列表。
- """
- serializer_class = RecommendedUserSerializer # RecommendedUserSerializer 现在已导入
- permission_classes = [permissions.IsAuthenticated]
- def get_queryset(self):
- current_user = self.request.user # CustomUser 现在已导入
- current_user_interest_ids = list(current_user.interests.values_list('id', flat=True))
- if not current_user_interest_ids:
- return CustomUser.objects.none()
- recommended_users = CustomUser.objects.filter(
- interests__id__in=current_user_interest_ids
- ).exclude(
- id=current_user.id
- ).distinct()
- recommended_users = recommended_users.annotate(
- common_interest_count=Count(
- 'interests',
- filter=Q(interests__id__in=current_user_interest_ids)
- )
- ).order_by('-common_interest_count', '?')
- current_user_interests_set = set(current_user.interests.all())
- for user_obj in recommended_users:
- user_interests_set = set(user_obj.interests.all())
- common_tags = list(current_user_interests_set.intersection(user_interests_set))
- user_obj.common_interests_list = common_tags
-
- return recommended_users
|