如何在django中序列化GenericRelation

时间:2014-01-23 14:04:07

标签: python django rest models django-rest-framework

我正在使用django rest框架,我想序列化GenericRelation

在我的模特中,我有:

class Asset(model.Models):
    name = models.CharField(max_length=40)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type','object_id')

class Project(models.Model):
    name = models.CharField(max_length=40)
    file = generic.GenericRelation(Asset)

我正在尝试为我的项目编写一个序列化,它将返回名称和资产ID。我有这个:

class AssetObjectRelatedField(serializers.RelatedField):

    def to_native(self, value):
        if isinstance(value, Project):
            serializer = Project(value)
        else:
            raise Exception('Unexpected type of asset object')

        return serializer.data


class ProjectSerializer(serializers.HyperlinkedModelSerializer):
    file = AssetObjectRelatedField()
    class Meta:
        model = Project
        fields = ('name','file')

当我尝试访问项目时,我得到:

  

意外类型的资产对象

我缺少什么想法?

更新:我搞定了。但它似乎不适合我读过的文档。答案是将传递给AssetObjectRelatedField的值视为资产类型。这与其记录的here

的不同之处不同

我现在有以下工作。

class AssetObjectRelatedField(serializers.RelatedField):
    def to_native(self, value):
        return value.id

1 个答案:

答案 0 :(得分:0)

将模型添加到内容类型可以解决此问题。这是一个例子。

 content_object = generic.GenericForeignKey('content_type', 'object_id')

https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations