如何序列化DRF中的通用关系?

Jek*_*son 1 python django django-rest-framework

我有一个管理员模型通过通用关系与其他三个模型相关联。

A = 'Active'
    D = 'Disabled'
    status = (
        (A, 'Active'),
        (D, 'Disabled')
    )

    limit_choices = (models.Q(app_label='core', model='track') | models.Q(app_label='core',
                    model='company') | models.Q(app_label='core', model='member') )
    content_type = models.ForeignKey(ContentType, limit_choices_to=limit_choices, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    status = models.CharField(max_length=7, choices=status, default=D)

class Track(models.Model):
    name = models.CharField(max_length=70)



class Company(models.Model):
    partner_id = models.ForeignKey(Track, related_name='companies', on_delete=models.CASCADE)
    name = models.CharField(max_length=70)


class Member(models.Model):
    carrier_id = models.ForeignKey(Track,  on_delete=models.CASCADE)
    name = models.CharField(max_length=70)
Run Code Online (Sandbox Code Playgroud)

对于序列化,我使用官方文档中的示例代码。

序列化器.py

class AdministratorSerializer(serializers.RelatedField):

    class Meta:
        fields = ('id', 'status', )
        model = Administrator

    def to_representation(self, value):

        if isinstance(value, Track):
            return value.id
        elif isinstance(value, Member):
            return value.id
        elif isinstance(value, Company):
            return value.id
        raise Exception('Unexpected type of tagged object')
Run Code Online (Sandbox Code Playgroud)

但我得到了一个错误

TypeError at /administrator/
__init__() takes exactly 1 argument (3 given)
Run Code Online (Sandbox Code Playgroud)

请帮我解决这个任务/

JPG*_*JPG 6

DRF 文档说,创建一个通用序列化器字段(此处为GenericField)并在您的序列化器类中进行连接(此处为AdministratorSerializer)。

class GenericField(serializers.RelatedField):

    def to_representation(self, value):

        if isinstance(value, Track):
            return value.id
        elif isinstance(value, Member):
            return value.id
        elif isinstance(value, Company):
            return value.id
        raise Exception('Unexpected type of tagged object')


class AdministratorSerializer(serializers.ModelSerializer):
    generic_data = GenericField(source='content_object', read_only=True)

    class Meta:
        fields = ('id', 'status', 'generic_data')
        model = Administrator
Run Code Online (Sandbox Code Playgroud)

  • 在 `GenericField` 中提供 **`read_only=True`**。检查我更新的答案@Jekson (2认同)