django-rest-framework-json-api icon indicating copy to clipboard operation
django-rest-framework-json-api copied to clipboard

Metadata on PolymorphicModelSerializer

Open Ardillen66 opened this issue 6 years ago • 4 comments

PolymorphicModelSerializer does not implement get_root_meta() to populate the meta key of the response JSON. This might be by design, but it took me some time to figure this out and implement this method to delegate to the appropriate serializer. I implemented get_root_meta() on the serializer that is extending PolymorphicModelSerializer in a similar way to get_fields(). The code:

class MySerializer(serializers.PolymorphicModelSerializer):

    def get_root_meta(self, resource, many):
        if self.instance not in (None, []):
            if not isinstance(self.instance, QuerySet):
                serializer_class = self.get_polymorphic_serializer_for_instance(self.instance)
                return serializer_class(self.instance, context=self.context).get_root_meta(resource, many)
            else:
                raise Exception("Cannot get metadata from a polymorphic serializer given a queryset")
        return {}

Not sure if this would be the way to imlpement it on PolymorphicModelSerializer, but it works for me. I think it would be nice if this is provided by default, or the documentation mentions that you need to implement it yourself when using PolymorphicModelSerializer.

p.s. First time posting an issue, so let me know if something is not clear or I missed something.

Ardillen66 avatar Sep 24 '19 14:09 Ardillen66

Thanks for reporting. This seems to have been missed when implementing polymorphic serailizers.

At a quick glance your code snippet looks good. It would be great if you could open a PR with a corresponding test.

sliverc avatar Sep 24 '19 19:09 sliverc

Hi, I'm interested in helping with this issue.

The code above sadly doesn't seem to work. The reason is that (in my case, at least) self.instance is a list and self.get_polymorphic_serializer_for_instance expects an object with a _meta attribute.

I'm happy to work on a PR, but if anybody more familiar with the code-base could provide some guidance as to how this is supposed to work, it would be much appreciated.

4nickel avatar Jan 24 '20 11:01 4nickel

@4nickel I do not quite see how self.instance can become a list. Are you able to reproduce this in the context of a DJA unit test?

sliverc avatar Jan 30 '20 17:01 sliverc