问题
我有一个具有以下标准通用外键字段的模型:
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
event_object = generic.GenericForeignKey('content_type', 'object_id')
根据 REST framework 的文档,我可以执行以下操作来正确序列化:
class WhateverSerializer(serializers.ModelSerializer):
event_object = serializers.RelatedField(source='event_object')
这很好用,但是在其他两种相关情况下,我无法正常工作:
- 我想用
HyperlinkedRelatedField
. 此字段需要 view_name 参数,我无法声明,因为视图名称因相关模型而异。我通过使用SerializerMethodField
,在运行时实例化 aHyperlinkedIdentityField
并返回它的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)