当前位置: 首页 > 知识库问答 >
问题:

使用Django Rest框架序列化泛型关系,并提供写支持

寿翰飞
2023-03-14

我有以下型号:

class TaggedItem(models.Model):
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

我试图以一种可以通过APIendpoint分配内容对象的方式序列化此模型

到目前为止,我已经做到了:

class TaggedItemSerializer(serializers.ModelSerializer):
    content_object = serializers.RelatedField(read_only=True)

    class Meta:
        model = TaggedItem

然而,这是只读的。如果删除read_only参数,则必须为字段指定查询集。然而,对于这种泛型关系,我有许多不同的模型类型。如果我在序列化器和模型中的其他地方指定所有可能的模型类型,这似乎是在复制代码。

我还可以通过object_id和content_type字段设置content对象,但是当我这样做时,会出现一个错误。

例如:

{
    ...
    object_id: 1,
    content_type: 'auth.User'
}

返回一个400响应,其中包含“详细信息”:“JSON解析错误-预期的对象或值”

如何通过DRF API使content_object可写?

共有1个答案

元彦君
2023-03-14

重写.to_internal_value. valester. create方法,如下所示:

from django.apps import apps

class TaggedItemSerializer(serializers.ModelSerializer):

    class Meta:
        model = TaggedItem
        read_only_fields = ('content_type', 'object_id', 'content_object')

    def to_internal_value(self, data):
        object_id = data.pop('object_id')
        content_type = data.pop('content_type')

        ret = super(ConfigCalcSerializer, self).to_internal_value(data)

        ret['object_id'] = object_id
        ret['content_type'] = content_type

        return ret

    def validate(self, data):
        object_id = data.pop('object_id')
        content_type = data.pop('content_type')

        Model = apps.get_model(content_type)

        try:
            content_object = Model.objects.get(id=object_id)
        except Model.DoesNotExist:
            raise serializers.ValidationError('Not found')
        else:
            data['content_object'] = content_object

        return data

    def create(self, validate_data):
        return TaggedItem.objects.create(**validate_data)
 类似资料:
  • 我用Jackson编写了自己的序列化程序。它接受一个变量或类,并返回任何简单类型的值。 示例:serialize(new MyClass(2.0))将返回一个值为 2.0 的双精度值,其中 MyClass 如下所示: 因此,为了获得正确的值,我需要设置@JsonValue,但是,当我序列化一个没有@JsonValue注释的对象(例如UUID)时,它会返回预期的UUID字符串。 创建我自己的类没有@

  • 我正在使用django REST框架,并尝试映射一个简单的外键关系,以提供相关数据供进一步使用,类似于以下请求: 使用django rest框架的序列化程序的反向关系 我收到的不是结果,而是以下异常: 当试图在序列化器上获取字段的值时,获得了Attie teError。序列化器字段可能命名不正确,并且与实例上的任何属性或键不匹配。原始异常文本是:“int”对象没有属性“album_name”。 模

  • 我需要将包含类型为Pair的对象的列表序列化为xml 首先,我创建了一个类PairList来保存对的列表,然后我创建了一个实际的类,它表示一对两个值,key和value。 然后,我尝试序列化它: 不幸的是,我遇到了一个异常:。欢迎任何关于如何避免此异常并序列化该类的想法。 如果我选择不序列化ttype和utype字段(通过将其设置为受保护或私有),则序列化有效。我不明白为什么它不想序列化类型字段。

  • 我目前正在研究一个使用泛型的模型,它有点复杂。我知道类似的问题也得到了回答,但没有一个能明确回答我的问题。 这是我的模型: 我的目标是使用jackson进行序列化和反序列化,如下所示: 我得到了以下java。序列化过程中的lang.StackOverflower错误: 非常感谢您的帮助。

  • 我在Android应用程序中实现Json反序列化时遇到了一些问题(带有Gson库)