Django endpoint does 300+ queries, select_related vs prefetch_related confusion
Hi, I am intern at a fintech, writing internal API in Django REST Framework. Endpoint /api/transfers/ returns 50 transfers and django-debug-toolbar shows 312 queries xD
Models: Transfer has two ForeignKeys to Account (sender, receiver), Account has ForeignKey to Customer, and Transfer has ManyToMany tags.
class TransferViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Transfer.objects.select_related("sender", "receiver")
serializer_class = TransferSerializer
class TransferSerializer(serializers.ModelSerializer):
sender_name = serializers.CharField(source="sender.customer.full_name")
receiver_name = serializers.CharField(source="receiver.customer.full_name")
tags = serializers.SlugRelatedField(many=True, read_only=True, slug_field="name")
class Meta:
model = Transfer
fields = ["id", "amount", "created_at", "sender_name", "receiver_name", "tags"]
With select_related("sender", "receiver") it went from 312 to 162. When I add "tags" to select_related I get:
FieldError: Invalid field name(s) given in select_related: 'tags'. Choices are: sender, receiver
How it is possible that select_related does not work for tags? And the customer of the account is still one query per row I think. Django 5.1, Postgres.
Accepted answer
Get the best of #rubber-duck-club weekly
One email each Monday with the most useful posts. No spam; unsubscribe in one click.
Comments
Sign in to join the conversation.
Sign in to commentAccepted answer