Django rest framework - request contextual key error

I have two models (Like and News). I use django-rest-framework to make a web api out of it.

class Like(models.Model):
    user = models.ForeignKey(User)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

class News(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=150)
    ...
    likes = GenericRelation(Like)

A A similar object has its own user storage field, which liked the news object. Now, to check if any particular user exists in any of the News objects, I get request.user from SerializerMethodField.

class NewsSerializer(serializers.HyperlinkedModelSerializer):
    user = UserSerializer()
    likes_count = serializers.IntegerField(source='likes.count', read_only=True)
    user_in_likes = serializers.SerializerMethodField()

    class Meta:
        model = News
        fields = ('user', 'title', 'body', 'article_image', 'pub_date', 'likes_count', 'user_in_likes')

    def get_user_in_likes(self, obj):
        user = self.context['request'].user
        what = obj.likes.filter(user=user).exists()
        return what

When I go to / news / url, I get json objects, including user_in_likestrue / false for each news object.

However, I have another serializer for another model that imports NewsSerializer classother similar serializers:

class ActivityObjectRelatedField(serializers.RelatedField):
    def to_representation(self, value):
        if isinstance(value, User):
            serializer = UserSerializer(value)
        elif isinstance(value, Job):
            serializer = JobSerializer(value)
        elif isinstance(value, News):
            serializer = NewsSerializer(value)
        elif isinstance(value, Tender):
            serializer = TenderSerializer(value)
        else:
            raise Exception('Unexpected type of tagged object')
        return serializer.data    

class ActivitySerializer(serializers.HyperlinkedModelSerializer):
    actor = ActivityObjectRelatedField(read_only=True)
    target = ActivityObjectRelatedField(read_only=True)

    class Meta:
        model = Activity
        fields = ('url', 'actor', 'verb', 'target', 'pub_date')

Now, if I am in /activities/to get objects of objects, I get an error message:

KeyError in / actions /

''

SerializerMethod NewsSerialize, self.context['request'].user.

:/vagrant/myproject/news/serializers.py get_user_in_likes, 25

, URL /news/, , . ? request ActivitiesSerializer class? , . .

+4
2

, request NewsSerializer to_representation().

to_representation(). , ActivitySerializer context, .

ActivitySerializer context to_representation() .

class ActivityObjectRelatedField(serializers.RelatedField):
    def to_representation(self, value):
        if isinstance(value, User):
            serializer = UserSerializer(value, context=self.context) # pass context
        elif isinstance(value, Job):
            serializer = JobSerializer(value, context=self.context) # pass context
        elif isinstance(value, News):
            serializer = NewsSerializer(value, context=self.context) # pass context
        elif isinstance(value, Tender):
            serializer = TenderSerializer(value, context=self.context) # pass context
        else:
            raise Exception('Unexpected type of tagged object')
        return serializer.data    
+5

, context NewsSerializer /activities/.

, , Django REST Framework, (. get_serializer_context() method) Serializer. /news/.

/activities/ ActivitySerializer () . NewsSerializer request. NewsSerializer. Serializer, context, (. DRF).

+2

All Articles