我想向序列化程序添加一个字段,其中包含特定于发出当前请求的用户的信息(我不想为此创建单独的端点)。我是这样做的:
视图集:
class ArticleViewSet(viewsets.ModelViewSet):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
filter_class = ArticleFilterSet
def prefetch_likes(self, ids):
self.current_user_likes = dict([(like.article_id, like.pk) for like in Like.objects.filter(user=self.request.user, article_id__in=ids)])
def get_object(self, queryset=None):
article = super(ArticleViewSet, self).get_object(queryset)
self.prefetch_likes([article.pk])
return article
def paginate_queryset(self, queryset, page_size=None):
page = super(ArticleViewSet, self).paginate_queryset(queryset, page_size)
if page is None:
return None
ids = [article.pk for article in page.object_list]
self.prefetch_likes(ids)
return page
序列化程序:
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article
def to_native(self, obj):
ret = super(ArticleSerializer, self).to_native(obj)
if obj:
view = self.context['view']
ret['has_liked'] = False
if hasattr(view, 'current_user_liked'):
ret['has_liked'] = obj.pk in view.current_user_liked
return ret
有没有一个更好的地方注入喜欢的文章的预取,或一个更好的方法来做这一般?
根据Django Documentation - SerializerMethodField,我不得不稍微更改rapid2share的代码。
你可以用
SerializerMethodField
示例:
然后应该从视图中调用序列化程序,如下所示:
我倾向于尝试在
Like
模型对象上尽可能多地放置这些内容,然后将其余内容放到自定义序列化器字段中。在序列化程序字段中,您可以通过
context
参数访问request
,该参数由它们的父序列化程序继承。所以你可以这样做:
然后,
user_likes_article
类方法可以封装预取(和缓存)逻辑。我希望这会有帮助。
相关问题 更多 >
编程相关推荐