如何使用Django Rest Framework序列化通用关系

bac*_*i32 6 python django serialization generic-foreign-key django-rest-framework

我在模型上使用Generic Relation并尝试使用Django Rest Framework对其进行序列化.但是,执行以下操作会给我一个属性错误:

'GenericForeignKey' object has no attribute 'field'
Run Code Online (Sandbox Code Playgroud)

models.py

class AdditionalInfo():

    #other fields

    seal_type = models.ForeignKey(ContentType,
        related_name='seal'
    )
    seal_id = models.PositiveIntegerField(null=True)
    seal = generic.GenericForeignKey(
                                'seal_type',
                                'seal_id')
Run Code Online (Sandbox Code Playgroud)

serializers.py

class AdditionalInfoSerializer():
    seal = serializers.Field(source='seal')
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我在django rest框架文档中找不到相关内容.

pgi*_*cek 6

如果要序列化通用外键,则需要定义自定义字段,以明确确定序列化关系目标的方式.

只要你的AdditionalInfo模型具有模型的通用关系SealType1SealType2,你可以看到下面的例子.

class SealRelatedField(serializers.RelatedField):

    def to_native(self, value):
        """
        Serialize seal object to whatever you need.
        """                            
        if isinstance(value, SealType1):
            return ...
        elif isinstance(value, SealType2):
            return ...

        raise Exception('Unexpected type of tagged object')
Run Code Online (Sandbox Code Playgroud)

您可以在Django REST框架文档中找到更多详细信息.