장고에서 User matching query does not exist 에러 어떻게 해결할 수 있을지 질문합니다.

조회수 8007회

장고에서 django rest framework 를 이용하는데 제가 django-freindship 이라는 파이썬 패키지를 적용하고자 했습니다. 그러다가 구글에서 https://pypi.python.org/pypi/fh-drf-friendship/0.1.1 이런 패키지가 있길래 쓰려고 했습니다. 근데 제가 파이썬도, 프로그래밍도 너무 초보인지라 이게 있어도 어떻게 적용하는지 몰라서 fh-drf-friendship의 코드를 직접 복사 붙여넣기 해서 써보려고 했는데요,

원래 fh-drf-friendship의 코드엔 serializers.py

User = get_user_model()
UserListSerializer = module_loading.import_string(settings.DRF_FRIENDSHIP['USER_LIST_SERIALIZER'])

요런 코드가 있었으나

제가 이미 django rest framework 를 쓰면서 Userseiralizer 라고 만들어놓은게 있어 그걸 쓰려고 저 코드는 지우고 복사해서 붙여넣었습니다. 그리고 저 코드가 제가 그냥 복사붙여넣었을 땐 제대로 작동하는 것 같지도 않았습니다.

views.py

class FriendViewSet(NestedViewSetMixin, mixins.ListModelMixin, mixins.CreateModelMixin,
                    mixins.DestroyModelMixin, viewsets.GenericViewSet):
    serializer_class = UserSerializer

    def create(self, request, *args, **kwargs):
        request.data['to_user'] = self.get_parents_query_dict()['user']
        serializer = FriendSerializer(data=request.data)
        if serializer.is_valid():
            instance = serializer.save()
            headers = self.get_success_headers(serializer.data)
            serializer = FriendReadSerializer(instance)
            return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def get_object(self):
        to_user = User.objects.get(pk=self.get_parents_query_dict().get('user'))
        from_user = User.objects.get(pk=self.kwargs.get('pk'))
        return Friend.objects.get(to_user=to_user, from_user=from_user)

serializers.py

  class UserSerializer(serializers.ModelSerializer):
        related_postwriter = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
        related_commentwriter = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
        class Meta:
            model = User
            fields = ('id', 'username', 'email', 'related_postwriter', 'related_commentwriter')


  class FriendSerializer(rest_framework_common.serializers.ModelSerializer):
        user = serializers.PrimaryKeyRelatedField(source='from_user', queryset=User.objects.all())

       class Meta:
            model = Friend
            exclude = ('url', 'from_user',)

        def create(self, validated_data):
            fr = FriendshipRequest.objects.get(from_user=validated_data['from_user'], to_user=validated_data['to_user'])

            if fr and fr.accept():
                return Friend.objects.get(from_user=validated_data['from_user'], to_user=validated_data['to_user'])


  class FriendReadSerializer(rest_framework_common.serializers.ModelSerializer):
        user = UserSerializer(source='from_user')
        created_at = serializers.DateTimeField(source='created')

        class Meta:
            model = Friend
            exclude = ('url', 'from_user', 'to_user', 'created',)

그래서 이런식으로 UserListSerializer를 UserSerializer로 바꿔서 붙여넣었는데

이게 큰 문제였을까요? 에러가 발생합니다.

django version == 1.9.7

django rest framework version == 3.4.1

python3 == 3.5

이렇게 쓰고 있고요

urls.py에는 router.register(r'friend', views.FriendViewSet, base_name='friend') 코드가 추가되어있습니다.

migrate랑 runserver 과정도 정상적으로 동작하지만, http://127.0.0.1:8000/friend/에 접속하게 되면

DoesNotExist at /friend/ User matching query does not exist 가 발생합니다.

제가 무슨 잘못을 저지른 건가요?

friendship의 모델 코드도 알아야 해결이 가능할까요? 너무 길어서 보기 불편하실 것 같아 일단 지금은 올리진 않으려고 합니다.

읽어주셔서 감사합니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • matching query does not exist 는 주로 objects.get가 정보를 찾지 못했을 때 발생합니다.

    User.objects.get(어쩌구)
    

    대신

    from django.shortcuts import get_object_or_404
    
    # ...
    User.objects.get_object_or_404(어쩌구)
    

    처럼 get_object_or_404를 사용해서 데이터를 찾지 못한 경우를 대비해주세요.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)