Django REST Framework и родовые отношения

проблема

У меня есть модель со следующими стандартными общими полями внешнего ключа:

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

Согласно структуре REST 's документы, я могу сделать следующее, чтобы сериализовать это правильно:

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

Это прекрасно работает, однако в двух других смежных ситуациях я могучтобы все заработало:

Я хотел бы использоватьHyperlinkedRelatedField, Это поле требует аргумента view_name, что я могуобъявить, так как имя представления зависит от модели. Я решил это с помощьюSerializerMethodField, создаваяHyperlinkedIdentityField во время выполнения и возвращая егоfield_to_native метод (см. фрагмент ниже). Это не очень элегантно.Я хотел бы вложить связанный объект непосредственно в сериализацию, сказавevent_object = SoAndSoSerializer(source='event_object'), Единственное решение, которое я вижу, это ходить каждый*Serializer Я определил и проверил, какая модель правильная, а затем использую ее. Опять же, это не очень элегантно.

Вопросы

HyperlinkRelatedField предназначен для работы через общие отношения? Я просто ошибаюсь? Есть ли очевидное решение для выбора правильного*Serializer что я'м отсутствует?

Фрагмент кода

Не элегантное решение, упомянутое в пуле 1 выше:

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)

Ответы на вопрос(1)

Ваш ответ на вопрос