Search code examples
djangodjango-rest-frameworkoauth-2.0

Django rest_framework oAuth2 APIView error


I am making a Django application API, where an authorized user can post a messages, and other users can browse the message and like/dislike/comment on the messages (twitter style).

I have implemented oAuth2 already and tested it.

The API works fine from the admin panel, but when I access it through url, it is giving error:

enter image description here

My models.py class is:

class Posts(models.Model):
    
    def expirationTimeCalculation(self):
        EXPIRATION_DURATION = 86400 #time in seconds
        expirationTime = self.creationTimestamp + timedelta(seconds = EXPIRATION_DURATION)
        return expirationTime

    def postLiveStatus(self):
        return (self.expirationTimestamp > timezone.now)

    def postLiveTimeRemaining(self):
        if (self.expirationTimestamp > timezone.now):
            return (self.expirationTimestamp - timezone.now).total_seconds()
        else:
            return 0


    postIdentifier = models.IntegerField()  
    title = models.CharField(max_length=100)
    message = models.TextField()
    topic = models.ManyToManyField('Topics')
    creationTimestamp = models.DateTimeField(default=timezone.now)
    expirationTimestamp = property(expirationTimeCalculation)
    post_owner = models.ForeignKey(AppUser, related_name='post_owner', on_delete=models.CASCADE)
    isLive = property(postLiveStatus)
    post_likes = models.ForeignKey('Likes', related_name="post_likes", on_delete=models.CASCADE)
    post_dislikes = models.ForeignKey('Dislikes', related_name="post_dislikes", on_delete=models.CASCADE)
    post_comments = models.ForeignKey('Comments', related_name="post_comments", on_delete=models.CASCADE)


    def __str__(self):
        return self.title


class Topics(models.Model):
    TOPICS = [('P','Politics'),('H','Health'),('S','Sports'),('T','Tech')]
    topicName = models.CharField(max_length=2, choices=TOPICS, blank=False)



class Likes(models.Model):
    isLiked = models.BooleanField(null=True)
    likes_owner = models.ForeignKey(AppUser, related_name='likes_owner', on_delete=models.CASCADE)
    post = models.ForeignKey(Posts, related_name='likes', on_delete = models.CASCADE)

class Dislikes(models.Model):
    isDisliked = models.BooleanField(null=True)
    dislikes_owner = models.ForeignKey(AppUser, related_name='dislikes_owner', on_delete=models.CASCADE)
    post = models.ForeignKey(Posts, related_name='dislikes', on_delete = models.CASCADE)

class Comments(models.Model):
    comment = models.TextField(null=True)
    comments_owner = models.ForeignKey(AppUser, related_name='comments_owner', on_delete=models.CASCADE)
    post = models.ForeignKey(Posts, related_name='comments', on_delete = models.CASCADE)

The serializer class is:

class CommentsSerializer(serializers.ModelSerializer):
    comments_owner = CreateUserSerializer()
    class Meta:
        model = Comments

        fields = ('comment', 'comments_owner')


class DislikesSerializer(serializers.ModelSerializer):
    dislikes_owner = CreateUserSerializer()
    class Meta:
        model = Dislikes
        fields = ('isDisliked', 'dislikes_owner')

class LikesSerializer(serializers.ModelSerializer):
    likes_owner = CreateUserSerializer()
    class Meta:
        model = Likes
        fields = ('isLiked', 'likes_owner')

class TopicsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Topics
        fields = ('topicName')

class PostsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Posts
        fields = ('postIdentifier', 'title', 'message', 'topic', 'creationTimestamp', 'expirationTimestamp', 'isLive', 'post_owner', 'post_likes', 'post_dislikes', 'post_comments')

Views class is:

from rest_framework.generics import ListAPIView
from .models import Posts
from .serializers import PostsSerializer



class PostsView(ListAPIView):
    queryset = Posts.objects.all()
    serilaizer_class = PostsSerializer

And the main URLS class is:

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
import posts_backend.views



urlpatterns = [
    path('admin/', admin.site.urls),
    path('o/', include('oauth2_provider.urls', namespace='oauth2_provider')), #Adding oAuth2 privider URLS to the url path
    path('authentication/', include('accounts.urls')), #Creating authentication endpoints http://10.61.64.150:8000/authentication/ for performing authentication
    path('v1/posts/', posts_backend.views.PostsView.as_view(),), # Version 1 of the API

]

Can anyone kindly let me know why I am getting this error and how to resolve this?


Solution

  • try renaming the attribute from serilaizer_class to serializer_class