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?请帮我解决这个问题.谢谢.
您收到此错误是因为在方法中实例化类或其他类似的序列化程序时,您没有传入request上下文NewsSerializerto_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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1823 次 |
| 最近记录: |