- Notifications
You must be signed in to change notification settings - Fork302
Description
On v4.0.0, inflection is not performed by the AutoPrefetchMixin for included resources, contrary to the JSONRenderer.
Suppose the following data model, serializers and viewsets:
from django.db import modelsfrom rest_framework import viewsets, mixinsfrom rest_framework_json_api import views, serializersclass Album(models.Model): title = models.TextField()class Track(models.Model) title = models.TextField() is_part_of = models.ManyToManyField(Album)class AlbumSerializer(serializers.ModelSerializer): class Meta: model = Album fields = ["title"]class TrackSerializer(serializers.ModelSerializer): class Meta: model = Track fields = ["title", "is_part_of"] included_serializers = { "is_part_of": AlbumSerializer, }
class Track( views.AutoPrefetchMixin, views.RelatedMixin, mixins.ListModelMixin, viewsets.GenericViewSet): serializer_class = serializers.TrackSerializer queryset = Track.objects.all()
BothGET /tracks?include=is-part-of
andGET /tracks?include=isPartOf
correctly return the set all of tracks along with their albums' titles embedded within theincluded
section of the response.
However, prefetch of the tracks' related album objects is not performed, as one would expect fromviews.AutoPrefetchMixin
.
My workaround is to performGET tracks?include=is_part_of
, which returns the same thing as the above two queries but also performs prefetching.
My investigation has shown me that theAutoPrefetchMixin
does not perform inflection of the result ofget_included_resources
that it uses to create the argument passed toprefetch_related
. The JSONRenderer does the following instead:
included_resources = copy.copy(included_resources) included_resources = [inflection.underscore(value) for value in included_resources]