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

序列化程序上的Django Rest框架条件字段

邢心水
2023-03-14

我有一个引用泛型关系的模型,我想以详细的方式序列化它。

class AType(models.Model):
    foo = CharField()


class BType(models.Model):
    bar = PositiveIntegerField()


class ToSerialize(models.Model):
    scope_limit = models.Q(app_label="app", model="atype") | \
                  models.Q(app_label="app", model="btype")
    content_type = models.ForeignKey(ContentType, limit_choices_to=scope_limit)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

我希望ToSeriize视图集的列表方法的JSON看起来像:

[
    {
       "atype": { "id": 1, "foo": "a" }
    },
    {
       "atype": { "id": 2, "foo": "b" }
    },
    {
       "btype": { "id": 1, "bar": "1" }
    },
    {
       "btype": { "id": 2, "bar": "2" }
    }
]

有没有办法让ToSeriize对象的视图集的序列化器基于content_type/object_id产生“条件字段”来实现这种效果?

共有3个答案

韦绍晖
2023-03-14

建议的方法是创建自定义RelatedField。查看关于泛型关系的DRF文档,以获得一个很好的示例。在OP案例中,它将如下所示:

class ABTypeRelatedField(serializers.RelatedField):

    def to_representation(self, value):
        """
        Serialize objects to a simple textual representation.
        """
        if isinstance(value, AType):
            return 'AType: ' + value.foo
        elif isinstance(value, BType):
            return 'BType: ' + value.bar
        raise Exception('Unexpected type of content_object')


class ToSerializeSerializer(serializers.Serializer):
    content_object = ABTypeRelatedField()
梁丘霖
2023-03-14

没有一个答案能真正回答这个问题。

简单的做法是默认添加所有字段,然后根据您的条件在序列化器初始化时将其删除。

在下面的示例中,我们在列出用户时不返回电子邮件。

class UserSerializer():

    fields = ('username', 'email')

    class Meta:
        model = User

    def __init__(self, *args, **kwargs):

        # Don't return emails when listing users
        if kwargs['context']['view'].action == 'list':
            del self.fields['email']

        super().__init__(*args, **kwargs)

袁山
2023-03-14

使用序列化方法字段:

class YourSerializer(serializers.ModelSerializer):
    your_conditional_field = serializers.SerializerMethodField()

    class Meta:
        model = ToSerialize

    def get_your_conditional_field(self, obj):
        # do your conditional logic here
        # and return appropriate result
        return obj.content_type > obj.object_id
 类似资料:
  • 问题内容: 如何将多对多字段序列化为列表,然后通过rest框架返回它们?在下面的示例中,我尝试返回该帖子以及与其关联的标签列表。 models.py serializers.py views.py 问题答案: 你将需要一个,其有。之后被创建,修改与一个关系:

  • 从文件中: read_only将其设置为True,以确保在序列化表示时使用该字段,而在反序列化期间更新实例时不使用该字段。 默认为假 required通常情况下,如果反序列化期间未提供字段,则会引发错误。如果反序列化过程中不需要此字段,则设置为false。 默认为True。 因此,我有一个模型,其中有一个字段不可为null,但我希望在pre_save方法中填充它,因此我在serializer中将该

  • 本文向大家介绍Django框架序列化与反序列化操作详解,包括了Django框架序列化与反序列化操作详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Django框架序列化与反序列化操作。分享给大家供大家参考,具体如下: Serializer类 1.定义: Django REST framework中的Serializer使用类来定义,须继承rest_framework.serialize

  • 问题内容: 想知道javascript中是否有没有jquery的函数或任何允许我序列化表单并访问序列化版本的框架? 问题答案: 小型from-serialize库不依赖框架。除此之外,您还需要自己实现序列化功能。(尽管重量为1.2KB,为什么不使用它?)

  • 问题内容: 像其他几个人一样,我在序列化Entity Framework对象时遇到问题,因此我可以通过JSON格式的AJAX发送数据。 我有以下服务器端方法,我正在尝试通过jQuery使用AJAX进行调用 通过AJAX调用会导致此错误: 这是因为实体框架创建循环引用以保持所有对象相关并且可访问服务器端的方式。 我从(http://hellowebapps.com/2010-09-26/produc

  • 我对django rest框架有一个关于泛型关系的小问题,这个泛型关系也用于唯一的约束。 我有这个模型: 它有一个通用关系和一个唯一的约束:专有网络的名称和通用关系(即所有者)。 以下是序列化程序: 在字段中,我不把content_type和object_id,因为我不想让用户显示/设置它们。 但是,我必须把它们放在UniqueTobetherValidator中,以避免在创建具有相同帐户/名称的