在 Django Rest Framework 中将整数的 JSON 列表转换为字符串

Posted

技术标签:

【中文标题】在 Django Rest Framework 中将整数的 JSON 列表转换为字符串【英文标题】:Convert JSON list of integers to String in Django Rest Framework 【发布时间】:2017-05-18 16:29:33 【问题描述】:

我正在尝试从用户那里获取整数列表并将其转换为逗号分隔的字符串,然后在 Django Rest Framework 中保存模型。

我的模型是这样的:

class Message(models.Model):
    name = models.CharField(max_length=100)
    regions = models.TextField(validators=[RegexValidator(regex='^[0-9,]+$')])
    created_at = models.DateTimeField(auto_now_add=True)

和我的序列化器:

class MessageSerializer(ModelSerializer):
    regions_list = serializers.ListField(child=serializers.IntegerField())

    class Meta:
        model = Message
        fields = ('id', 'name', 'regions_list', 'created_at')
        read_only_fields = ('created_at')

我的意见:


  "name": "TEST",
  "regions_list": [1, 2, 3, 4]

如何在 db 中将 region_list 转换为逗号分隔的字符串(区域)?

Django:1.10DRF:3.5

【问题讨论】:

【参考方案1】:

我覆盖了to_representationto_internal_value 方法。它对我很有用。

class MessageSerializer(ModelSerializer):
    regions_list = serializers.ListField(child=serializers.IntegerField())

    class Meta:
        model = Message
        fields = ('id', 'name', 'regions_list', 'created_at')
        read_only_fields = ('created_at')

    def to_representation(self, instance: Message):
        instance.regions_list = [int(i) for i in instance.regions.split(',')]
        return super(MessageSerializer, self).to_representation(instance)

    def to_internal_value(self, data):
        ret = super(MessageSerializer, self).to_internal_value(data)
        if ret['regions_list']:
            ret['regions'] = ','.join(str(i) for i in ret['regions_list'])

        return ret

【讨论】:

【参考方案2】:

你可以覆盖MessageSerializer中的create方法:

class MessageSerializer(ModelSerializer):
    # .... 

    def create(self, validated_data):
        regions_string = ','.join(validated_data.pop('regions_list', []))
        validated_data['regions'] = regions_string
        return Message.objects.create(**validated_data)

【讨论】:

tnx @Yevhen。当新实例返回并且我想向用户 Response(serializer.data, status=status.HTTP_201_CREATED) 发送响应时,我收到此错误:Original exception text was: 'Message' object has no attribute 'regions_list'. 这个怎么样?【参考方案3】:

如果你使用的是 PostgresSQL 数据库,你可以使用 Django 内置的ArrayField。这也将允许您在 IntegerField 上使用基于标准 Django 的字段属性。例如,您可以将允许的整数范围限制为可用区域(即 1-8)。

class Message(models.Model):
  # ...
  regions = ArrayField(models.IntegerField(min_value=1, max_value=8), default=list)

如果不包含参数,default=list 语句会在数据库中创建一个空列表。

【讨论】:

以上是关于在 Django Rest Framework 中将整数的 JSON 列表转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

django使用rest_framework

Django Rest Framework

Django rest framework 身份和权限验证

Django Rest Framework:非模型服务

django-rest-framework - 在可浏览的 API 中自动生成表单?

在 django-rest-framework 中,是不是可以同时使用 oauth 和 session 身份验证?