@action获得了意外的关键字参数'id'

问题描述 投票:0回答:1
class CustomUserViewSet(UserViewSet):
    
    serializer_class = UserSerializer
    pagination_class = PageNumberPagination
    permission_classes = [permissions.IsAuthenticated]
    
    def get_queryset(self):
        queryset = User.objects.all()
        return queryset
    
    @action(detail=False, methods=['put', 'delete'], url_path='me/avatar')
    def set_avatar(self, request):
        if request.method == 'PUT':
            serializer = SetAvatarSerializer(
                request.user,
                data=request.data,
                partial=True
            )
            serializer.is_valid(raise_exception=True)
            serializer.save()
            return Response(status=status.HTTP_200_OK)
        user = request.user
        user.avatar.delete()
        user.save()
        return Response(status=status.HTTP_204_NO_CONTENT)
    
    @action(detail=True, methods=['post', 'delete'], url_path='subscribe')
    def set_or_delete_subscribe(self, request, pk=None):
        user = request.user
        user_to_subscribe = self.kwargs['id']
        if request.method == 'POST':
            _, created = Subscription.objects.get_or_create(user=user, subscribed=user_to_subscribe)
            if created:
                return Response(status=status.HTTP_201_CREATED)
            return Response(status=status.HTTP_400_BAD_REQUEST)

        if request.method == 'DELETE':
            subscription = Subscription.objects.filter(user=user, subscribed=user_to_subscribe).delete()
            if subscription:
                return Response(status=status.HTTP_204_NO_CONTENT)
            return Response(status=status.HTTP_400_BAD_REQUEST)


model of Subscription

class Subscription(models.Model):
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='subscriptions'
    )
    subscribed = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='subscribed'
    )

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['user', 'subscribed'], name='unique_subscription')
        ]

urls

router = DefaultRouter()
router.register(r'tags', TagViewSet, basename='tags')
router.register(r'recipes', RecipeViewSet, basename='recipes')
router.register(r'ingredients', IngridientsViewSet, basename='ingredients')
router.register(r'users', CustomUserViewSet, basename='users')

typeerror:set_or_delete_subscribe()有一个意外的关键字参数'id' [10/MAR/2025 08:38:23]“ POST/API/USESS/11/subscribe/http/1.0” 50088724

我不知道为什么get_object()期望ID并且不接受PK? 到目前为止,我缺少一些东西,但我无法抓住它。如果已经订阅,我需要订阅用户或删除它们。

django django-rest-framework user-input action
1个回答
0
投票
改变这个

user_to_subscribe = self.kwargs['id']

to

user_to_subscribe = self.kwargs['pk']

up up thisthis

的方法

@action(detail=True, methods=['post', 'delete'], url_path='subscribe') def set_or_delete_subscribe(self, request, pk=None): user = request.user user_to_subscribe = User.objects.get(pk=pk) if request.method == 'POST': _, created = Subscription.objects.get_or_create(user=user, subscribed=user_to_subscribe) if created: return Response(status=status.HTTP_201_CREATED) return Response(status=status.HTTP_400_BAD_REQUEST) if request.method == 'DELETE': subscription = Subscription.objects.filter(user=user, subscribed=user_to_subscribe).delete() if subscription: return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_400_BAD_REQUEST)

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.