2017-09-19 14 views
0

私のポスト・シリアライザは、トップコメント私は以下の冗長コードをマークし、コメント)(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 

答えて

1

私はあなたとのコメントをプリフェッチすることにより、クエリの量を最小限に抑えることができると思うが当たるたびN×2行を照会する必要はありませんポスト。それを試して、あなたはcomment_setがあなたのrelated_name別名逆にする必要があります

Post.objects.all().prefetch_related('comment_set') 

(数回下に、私はよ再利用comment_set)にビューでクエリセットを変更して遊ぶことができます。

そして、それがプリフェッチを使用するために、あなたは私がプリフェッチの内部を知らないが、私はへのコメントを期待

obj.comment_set.objects.all()[:2] 

Comment.objects.filter_by_instance(obj)[:2] 

を変更する必要がありますすでにobjでプリフェッチされているので、新しいクエリは必要ありません。

私はあなたがこのクエリはカウントダウンを取得する場合に役立ちます聞いて興味が

obj.comment_set.objects.count() 

を使用する場合、カウントはまた、プリフェッチから実行することができ期待!また、プリフェッチによってパフォーマンスが低下する場合もあることに注意してください。ウェブ上に興味深い記事がいくつかあります。

+1

プリフェッチはうまくいっていません。メソッドごとに別々の 'filter()'クエリを実行すると、プリフェッチされたデータが無視されるためです。 – zaidfazil

+0

私はパフォーマンスのためにそれを試してみましょう..私はzaidfazilが正しいと思います –

+0

私はfilter_by_instanceを使用しないで、代わりにコメントをプリフェッチしたオブジェクトからそれを照会することを提案した理由です。私はかなりあなたのクエリカウントをもたらすだろうと確信しています。 – Vincent

関連する問題