Django的REST框架和通用的关系(Django REST Framework and gene

2019-08-07 17:23发布

问题

我有以下标准通用外键的字段的模型:

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')

这工作得很好,但在其他两个相关的情况下,我不能把事情的工作:

  1. 我想用HyperlinkedRelatedField 。 此字段需要VIEW_NAME说法,这是我不能宣布自视图名称与相关型号不同而不同。 我解决了这个通过使用SerializerMethodField ,实例化HyperlinkedIdentityField在运行时和返回它的field_to_native方法(见下文代码段)。 这并不感到很优雅。
  2. 我想通过说直接巢相关对象中的序列化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)

Answer 1:

您的权利,REST框架不支持那些使用案例,它不是明显对我的设计是什么样子,如果它没有。 你可能会需要它,我不认为我会在很热衷模型 - >视图的隐式注册(为超链接的情况下)和模型 - >串行器(用于嵌套的情况下)。

做你所需要的最简单的方法可能是继承ManyRelatedField并创建一个自定义字段类型,覆盖to_native(self, obj)序列化的每个对象在你想要的设置完全相同的方式。



文章来源: Django REST Framework and generic relations