I'm trying to serialize related field set to list. The problem is serializing a QuerySet
is very inefficient.
class ZipCode(..):
city = ForeignKey...
code = CharField...
class CityManager(models.Manager):
def get_queryset(self):
return super().get_queryset().select_related('county').prefetch_related('zipcodes').annotate(
realestate_count=Count('zipcodes__realestates')).order_by('name', )
class City(..):
objects = CityManager()
....
@property
def zip_codes_list(self):
return self.zipcodes.values_list('code', flat=True)
As you can see, I'm prefetching zipcodes
so I suppose it shouldn't do so many queries.
class CitySerializer(serializers.ModelSerializer):
county = CountySerializer(read_only=True)
zip_codes_list = serializers.ListField(read_only=True)
realestate_count = serializers.IntegerField(default=0, read_only=True)
indexed_at_hmnz = serializers.CharField(read_only=True)
index_status_display = serializers.CharField(source='get_index_status_display', read_only=True)
class Meta:
model = City
fields = ['id', 'name', 'county', 'realestate_count', 'zip_codes_list','indexed_at', 'indexed_at_hmnz',
'index_status_display', 'is_followed']
According to the Django debug toolbar, it queries zipcodes for every object separately.
Do you know how to make it more efficient?