<p>我可以想出两种方法来达到这个目的。在</p>
<ol>
<li><p>如果您只需要一个<code>boolean</code><code>True</code>/<code>False</code>是否喜欢<code>Post</code>,那么可以使用<code>.extra</code>。在</p>
<p>1.1条。将您的<code>BlogPost</code><code>Queryset</code>改为如下所示:</p>
<pre><code>class BlogPostQuerySet(models.QuerySet):
def annotate_is_liked_by_user(self, user):
return self.extra(
select = {'is_liked': 'EXISTS( \
SELECT `id` FROM `blogpostlikes` \
WHERE `blogpostlikes`.`blogpost_id` = `blogpost`.id \
AND `blogpostlikes`.`user_id` = %s)' % user.id
}
)
class BlogPost
# other stuffs here
objects = BlogPostQuerySet.as_manager()
</code></pre>
<p>1.2条。在<code>BlogPostList</code>视图中更改<code>get_queryset</code>方法</p>
^{pr2}$
<p>1.3条。将新字段添加到<code>BlogPostSerializer</code></p>
<pre><code>class BlogPostSerializer(serializer.ModelSerializer):
# ....
is_liked = serializers.BooleanField(source='is_liked')
# ...
</code></pre></li>
<li><p>获取整个<code>BlogPostLike</code>对象。在</p>
<p>2.1.更改<code>get_queryset</code>方法。在</p>
<pre><code>class BlogPostList(ListAPIView):
def get_queryset(self):
user = self.request.user
return BlogPost.objects.prefetch_related(
Prefetch(
'likes',
queryset=BlogPostLikes.objects.filter(user=user) \
.select_related('user'),
to_attr='likes_by_request_user'
)
)
</code></pre>
<p>2.2条。改变<code>serializer</code>。但这可以通过两种方式实现:</p>
<p>2.2.1条。序列化包含一项的列表:</p>
<pre><code>class BlogPostSerializer(serializer.ModelSerializer):
# ...
likes_by_request_user = BlogPostLikesSerializer(many=True)
</code></pre>
<p>并从^{<cd16>中删除<code>blogpost = BlogPostSerializer()</code>。我认为这会导致无限循环。在</p>
<p>2.2.2序列化单个对象:</p>
<pre><code>class BlogPostSerializer(serializer.ModelSerializer):
# ...
like_by_request_user = BlogPostLikesSerializer(source='get_last_like', required=False)
</code></pre>
<p>但是通过这种方式,您必须在<code>BlogPost</code>对象中添加一个新方法来返回这个<code>Like</code>对象</p>
<pre><code>class BlogPost(models.Model):
#...
def get_last_like(self):
if hasattr(self, 'likes_by_request_user') and len(self.likes_by_request_user) > 0:
return self.likes_by_request_user[0]
return None
</code></pre></li>
</ol>