2017-12-22 18 views
0

がされて最適化:私は思ったんだけど

シリアライザ:

class SerializerA(serializers.ModelSerializer): 
    class Meta: 
     model = Model_A 
     fields = ('id', 'official_name', 'gender') 
     depth = 1 

class SerializerB(serializers.ModelSerializer): 
    user = SerializerA(many=True) 
    class Meta: 
     model = Model_B 
     fields = ('id', 'project_name','project_type', 'project_start_date', 'user') 
     depth = 1 

APIを:

私はSQLクエリから78回を照会していますこの、私はこのページをAPIのURLに移動して、デバッグ場合、it''lショーとなりました
class ReportAPI(APIView): 
    def get(self, request): 
     all_projects = Model_B.objects.all() 
     project_serializer = SerializerB(all_projects, many=True) 
     return Response(project_serializer.data) 

。しかし、私はmanytoから1つのフィールドを削除する場合'gender'、多くのセリエイタイザーフィールドは、ページは今データベース21回だけクエリを行うので、私の質問は再び、どのように私はこれを最適化できますか?

答えて

1

オブジェクトごとにデータベースにヒットしないように、select_related(ForeignKeyの場合)および/またはprefetch_related(ManyToManyまたはManyToOneの場合)を使用できます。ユーザモデルはあなたがそれのシリアライザに必要な他のFKを持っているならば、あなたもselect_related('user', 'user__other_field')を行うことができ、

class ReportAPI(APIView): 
    def get(self, request): 
     all_projects = Model_B.objects.all().select_related('user') 
     project_serializer = SerializerB(all_projects, many=True) 
     return Response(project_serializer.data) 

userなら、あなたが行うことができますModel_BでFKです。

+0

助けてくれてありがとうございます@Gabriel、これを利用した後、78から10への私のクエリのドロップはもう一度ありがとう!! –

関連する問題