Django REST Framework y relaciones genéricas.

Problema

Tengo un modelo con los siguientes campos de clave externa genéricos estándar:

content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
event_object = generic.GenericForeignKey('content_type', 'object_id')

De acuerdo con los documentos del marco REST, puedo hacer lo siguiente para serializar esto correctamente:

class WhateverSerializer(serializers.ModelSerializer):
    event_object = serializers.RelatedField(source='event_object')

Esto funciona bien, sin embargo, en otras dos situaciones relacionadas, no puedo hacer que las cosas funcionen:

Me gustaria usarHyperlinkedRelatedField. Este campo requiere el argumento view_name, algo que no puedo declarar ya que el nombre de la vista varía con el modelo relacionado. Resolví esto usandoSerializerMethodField, instanciando unHyperlinkedIdentityField en tiempo de ejecución y devolviendo sufield_to_native método (ver fragmento a continuación). Esto no se siente muy elegante.Me gustaría anidar el objeto relacionado directamente en la serialización diciendoevent_object = SoAndSoSerializer(source='event_object'). La única solución que puedo ver es caminar cada*Serializer He definido y verifico cuál tiene el modelo correcto, luego lo uso. De nuevo, esto no se siente muy elegante.

Preguntas

¿HyperlinkRelatedField está destinado a funcionar en una relación genérica? ¿Estoy cometiendo un error? ¿Hay una solución obvia para elegir el derecho?*Serializer que me estoy perdiendo?

Fragmento de código

La solución poco elegante mencionada en el punto 1 anterior:

class WhateverSerializer(DefaultSerializer):

    event_object_url = serializers.SerializerMethodField('get_related_object_url')
    # ...

    def get_related_object_url(self, obj):
        obj = obj.event_object
        default_view_name = '%(model_name)s-detail'
        format_kwargs = {
            'app_label': obj._meta.app_label,
            'model_name': obj._meta.object_name.lower()
        }
        view_name = default_view_name % format_kwargs
        s = serializers.HyperlinkedIdentityField(source=obj, view_name=view_name)
        s.initialize(self, None)
        return s.field_to_native(obj, None)

Respuestas a la pregunta(1)

Su respuesta a la pregunta