postgresql - Optimizing django related set average in a django rest framework serializer -


i'm using django 1.8 django rest framework. have 2 models: marker , markercomment.

class marker(models.model):     # bunch of fields here...      def rating(self):         """         return mean rating comments         """         return self.comments.aggregate(models.avg('rating'))['rating__avg']   class markercomment(models.model):     # few fields here...      marker = models.foreignkey(marker, blank=false, related_name='comments')         rating = models.positivesmallintegerfield(blank=false) 

in serializer have :

class markerserializer(serializers.hyperlinkedmodelserializer):     class meta:         model = marker         fields = (             'url', 'pk', 'created', 'name', 'category', 'rating', ...         )         read_only_fields = ('rating') 

the list query on serializer taking way long since it's querying every single marker average. see newrelic:

new relic graph, it's slow 1,800ms average

this query that's run every marker in result set:

select avg("maps_markercomment"."rating") "rating__avg" "maps_markercomment" "maps_markercomment"."marker_id" = 1788 

if wasn't using django rest framework, i'd ratings @ once like

marker.objects.filter(...).annotate(rating=avg('comments__rating')) 

so question is: options here make faster? there way have in single sql query while still using serializer? how have cache rating every marker?

you may apply desired optimizations queryset in view(s), optimized queryset passed serializers.


Comments