0

I am trying to access a specific comment using the retrieve method in Django View sets. I am using a default router in order to route my urls. I am able to list all comments at api/posts/, but am unable to get a single comment at api/posts/1. I am getting a type error: Field.init() got an unexpected keyword argument 'pk' when trying to access the URL. Any ideas as to why?

urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from posts.views import PostsViewSet, CommentsViewSet

router = DefaultRouter()
router.register(r"comments", CommentsViewSet, basename='comments')

urlpatterns = [
    path("", include(router.urls)),
]
views.py
class CommentSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(label='commentID')
    comment = serializer.CharField()
    created_at = serializers.DateTimeField(required=False)
    updated_at = serializers.DateTimeField(required=False)
    posts = serializers.SerializerMethodField()

    class Meta:
        model = Comments
        # fields = "__all__"
        fields = ['id', 'comment','created_at', 'updated_at', 'posts']

        def to_representation(self, instance: Comment) -> dict:
            '''Pass for now'''
            ret = super().to_representation(instance)
            return ret

        def get_queryset(self) -> QuerySet:
            qs = Comment.objects.all()
            return qs

        def create(self, validated_data: dict) -> Comment:
            return Comment.objects.create(**validated_data)

        def update(self, instance: Comment, validated_data: dict) -> Comment:
            '''Pass post-validation errors silently'''
            for field in validated_data:
                setattr(instance, field, validated_data.get(
                    field, getattr(instance, field)))
            instance.save()
            return instance
class CommentViewSet(viewsets.ViewSet):
    def list(self, request):
        queryset = Comment.objects.all()
        result = CommentSerializer(queryset, many=True)
        if result:
            return Response(result.data)
        else:
            return Response(data=result.data, status=200)

    def retrieve(self, request, pk=None):
        queryset = Comment.objects.all()
        condition = get_object_or_404(queryset, pk=pk)
        result = CommentSerializer(queryset, pk=pk)
        print(result)
        return Response(result.data)
Phil Cho
  • 131
  • 3
  • 14

1 Answers1

1

First you are not using the condition object in serializer.

Second drf default pk field name is id not pk and no need to pass pk during serialization process.Below is updated retrieve method kindly check the same.

def retrieve(self, request, pk=None):
        # queryset = Comment.objects.all() #no need as you are using get_object_or_404 to fetch single object
        condition = get_object_or_404(Comment, id=pk) #replaced pk by id here
        result = StudentSerializer(condition) #used condition in serializer
        print(result)
        return Response(result.data)
Ashish Nautiyal
  • 861
  • 6
  • 8