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:

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
Post a Comment