장고에서 User matching query does not exist 에러 어떻게 해결할 수 있을지 질문합니다.
조회수 8031회
장고에서 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
를 사용해서 데이터를 찾지 못한 경우를 대비해주세요.-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력