Python 如何序列化DRF中的泛型关系?

Python 如何序列化DRF中的泛型关系?,python,django,django-rest-framework,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='comp

我有一个管理员模型,通过泛型关系与其他三个模型关联

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)
对于序列化,我使用官方文档中的示例

序列化程序.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')
但我犯了个错误

TypeError at /administrator/
__init__() takes exactly 1 argument (3 given)

请帮助我解决此任务

DRF文档说,创建一个通用序列化程序字段(此处,
GenericField
),并连接到序列化程序类中(此处,
AdministratorSerializer

class GenericField(serializers.RelatedField):
def到_表示(自身、值):
如果存在(值、轨迹):
返回值.id
elif isinstance(值、成员):
返回值.id
elif isinstance(价值,公司):
返回值.id
引发异常(“标记对象的意外类型”)
类管理员序列化程序(序列化程序.ModelSerializer):
generic\u data=GenericField(source='content\u object',read\u only=True)
类元:
字段=('id','status','generic_data')

model=Administrator
序列化程序。RelatedField
应该用于字段,而不是用于模型序列化程序。谢谢,我想这正是我需要的。但是现在我得到了消息
AssertionError:Relational字段必须在
GenericField
中提供一个
queryset`参数,重写
get\u queryset
,或者设置read\u=
True
`provide
read\u only=True
。检查我的更新答案@Jeksonyes它的工作。你能告诉我,如果我能得到什么,我会得到不仅是id,而且还有一个链接到相关模型?我尝试将ModelSerializer更改为HyperlinkedModelSerializer,但这不会更改结果。哦..这似乎是另一个问题。你应该问一个新的:)
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