23π
As it is currently writen, using a SerializerMethodField
, you are making N+1 queries. I have covered this a few times on Stack Overflow for optimizing the database queries and in general, itβs similar to how you would improve the performance in Django. You are dealing with a one-to-many relationship, which can be optimized the same way as many-to-many relationships with prefetch_related
.
class HouseSerializer(serializers.ModelSerializer)
rooms = RoomSerializer(read_only=True, source="room_set", many=True)
class Meta:
model = House
fields = ('id', 'name', 'address', )
The change I made uses nested serializers instead of manually generating the serializer within a SerializerMethodField
. I had restricted it to be read_only
, as you mentioned you only need it for GET
requests and writable serializers have problems in Django REST Framework 2.4.
As your reverse relationship for the Room
-> House
relationship has not been set, it is the default room_set
. You can (and should) override this by setting the related_name
on the ForeignKey
field, and you would need to adjust the source
accordingly.
In order to prevent the N+1 query issue, you will need to override the queryset on your view. In the case of a generic view, this would be done on the queryset
attribute or within the get_queryset
method like queyset = House.objects.prefetch_related('room_set')
. This will request all of the related rooms alongisde the request for the House
object, so instead of N+1 requests you will only have two requests.