问题
我有以下标准通用外键的字段的模型:
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
event_object = generic.GenericForeignKey('content_type', 'object_id')
据REST框架的文档,我可以做以下正确连载这样的:
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)