私のポスト・シリアライザは、トップコメントと私は以下の冗長コードをマークし、コメント)(serializers.SerializerMethodFieldで冗長コードを削減
の数を返します。
class PostDetailSerializer(serializers.ModelSerializer):
comments = serializers.SerializerMethodField()
comment_count = serializers.SerializerMethodField()
class Meta:
model = Post
fields = (
...
'comments',
'comment_count',
)
# showing the most recent comments
def get_comments(self, obj):
content_type = obj.get_content_type <<
object_id = obj.id <<
comments = Comment.objects.filter_by_instance(obj)[:2] <<
return CommentSerializer(comments, many=True).data
# showing the number of comments
def get_comment_count(self, obj):
content_type = obj.get_content_type <<
object_id = obj.id <<
comments_count = Comment.objects.filter_by_instance(obj).count() <<
return comments_count
それ自体が正常に動作しますが、私はそれがPostDetailSerializer
expected output is below
.....
"comments": [
{
...
"content": "Edited!",
...
},
{
...
"content": "New wwaa!",
...
}
],
"comment_count": 4
プリフェッチはうまくいっていません。メソッドごとに別々の 'filter()'クエリを実行すると、プリフェッチされたデータが無視されるためです。 – zaidfazil
私はパフォーマンスのためにそれを試してみましょう..私はzaidfazilが正しいと思います –
私はfilter_by_instanceを使用しないで、代わりにコメントをプリフェッチしたオブジェクトからそれを照会することを提案した理由です。私はかなりあなたのクエリカウントをもたらすだろうと確信しています。 – Vincent