django rest framework - 请求上下文密钥错误

Aam*_*amu 5 django json django-rest-framework

我有两个模型(喜欢和新闻).我正在使用django-rest-framework来制作一个web api.

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)
Run Code Online (Sandbox Code Playgroud)

一个像物体都有它自己的用户字段来存储谁喜欢的新闻对象.现在要检查特定用户是否存在于任何类似的News对象中,我从SerializerMethodField获取request.user.

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
Run Code Online (Sandbox Code Playgroud)

当我去/ news/url时,我得到的json对象包括user_in_likes每个新闻对象的true/false.

但是,我有另一个用于进口NewsSerializer class和其他类似序列化器的不同型号的系列:

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')
Run Code Online (Sandbox Code Playgroud)

现在,如果我访问/activities/,获取活动对象,我收到一个错误:

/ activities /中的KeyError

'请求'

它指向self.context['request'].user使用NewsSerialize类的SerializerMethod行.

例外位置:/vagrant/myproject/news/serializers.py in get_user_in_likes,第25行

再次,如果我访问/news/网址,一切都很好,我得到新闻对象.我在这里错过了什么?为什么request不被认可ActivitiesSerializer class?请帮我解决这个问题.谢谢.

Rah*_*pta 7

您收到此错误是因为在方法中实例化类或其他类似的序列化程序时,您没有传入request上下文NewsSerializerto_representation().

您在to_representation()方法中手动实例化特定的序列化程序类.因此,实例化后,该特定序列化程序不能访问ActivitySerializercontext,从而导致错误.

您可以通过ActivitySerializercontext实例化过程中的相关序列化的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    
Run Code Online (Sandbox Code Playgroud)