Anna
Anna

Reputation: 974

Django Rest Framework: how to access single API elements in URL?

I want to access every API element by URL like this "/api/v1/element_id"

I have explicitly defined the pk in serializers

serializers.py

class TweetSerializer(serializers.ModelSerializer):
    tweet_id = serializers.IntegerField()

    class Meta:
        fields = ('tweet_id', 'author', 'text', 'created_at', 'retweet_count', 'favourite_count',)
        model = Tweet

But it does not work. I get Not found error

models.py

class Tweet(models.Model):
    #tweet_id = models.ForeignKey(User, on_delete=models.CASCADE)
    tweet_id = models.IntegerField()
    created_at = models.CharField(max_length=100)
    text = models.TextField()
    author = models.CharField(max_length=100)
    retweet_count = models.IntegerField()
    favourite_count = models.IntegerField()

    def __str__(self):
        return str(self.tweet_id)

views.py


class TweetList(generics.ListCreateAPIView):
    queryset = Tweet.objects.all()
    serializer_class = TweetSerializer


class TweetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Tweet.objects.all()
    serializer_class = TweetSerializer

urls.py

urlpatterns = [
    path('<int:pk>/', TweetDetail.as_view()),
    path('', TweetList.as_view()),
]

Listing all tweets works fine, /api/v1/, but single tweet is not returned.

I have tried to set a ForeignKey in the models but then I get an error column tweet_id_id not found.

Upvotes: 0

Views: 375

Answers (1)

crazychukz
crazychukz

Reputation: 676

You generally need to add a lookup_field to view if you wish to retrieve a particular object.

So in this scenario, your lookup_field is tweet_id

Your view becomes

class TweetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Tweet.objects.all()
    serializer_class = TweetSerializer
    lookup_field = 'tweet_id'

Then you reference same lookup_field in your url. So your url becomes

path('<tweet_id>', TweetDetail.as_view()),

Upvotes: 1

Related Questions