DRF之序列化

一、作用

  1. 将数据序列化或反序列化
  2. 对提交的数据进行校验
  3. 对提交的数据进行处理

二、返回json的方法

创建表:

class Publisher(models.Model):
    name = models.CharField(max_length=32, verbose_name="名称", unique=True)
    address = models.CharField(max_length=128, verbose_name="地址")
    operator = models.ForeignKey("auth.User")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "出版社"
        verbose_name_plural = verbose_name
  • 自己实现

def publish_list(request):
    query_list = models.Publisher.objects.all()

    data=[]
    from django.forms.models import model_to_dict
    for i in query_list:
        data.append(model_to_dict(i))
    import json
    return HttpResponse(json.dumps(data),content_type='application/json')
  •  使用model_to_dict

def publish_list(request):
    query_list = models.Publisher.objects.all()
    from django.forms import model_to_dict
    for data in query_list:
        data=model_to_dict(data)
    return HttpResponse(data, content_type='application/json')
  •  使用Django自带的serializers

def publish_list(request):
    query_list = models.Publisher.objects.all()

    from django.core import serializers  

    data = serializers.serialize("json", query_list)

    return HttpResponse(data, content_type='application/json')
  •  上面几种方法虽然可以返回json数据,但是不能对传来的数据进行反序列化,引入DRF的序列化类(serializers.py)

class PublisherSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=32)
    address = serializers.CharField(max_length=128)

    def create(self, validated_data):
        return models.Publisher.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.name = validated_data.get("name", instance.name)
        instance.address = validated_data.get("address", instance.address)
        instance.save()
        return instance

 视图

def publish_list(request):
    query_list = models.Publisher.objects.all()

    from app01 import serializers
    serializer = serializers.PubliserSerializer(query_list, many=True)
    import json
    return HttpResponse(json.dumps(serializer.data), content_type='application/json')

 效果:

  •  使用ModelSerializer

 

class PublisherSerializer(serializers.ModelSerializer):
    operator = serializers.ReadOnlyField(source="operator.username")

    class Meta:
        model = models.Publisher
        fields = (
            "id",
            "name",
            "address",
            "operator"
        )

 视图:

def publish_list(request):
    query_list = models.Publisher.objects.all()

    from app01 import serializers
    serializer = serializers.PubliserSerializer(query_list, many=True)
    import json
    return HttpResponse(json.dumps(serializer.data), content_type='application/json')

 

  • 序列化器类与Django Form类非常相似,并在各种字段中包含类似的验证标志,例如requiredmax_lengthdefault
  • 字段标志还可以控制serializer在某些情况下如何显示,比如渲染HTML的时候。上面的{'base_template': 'textarea.html'}标志等同于在Django Form类中使用widget=widgets.Textarea。这对于控制如何显示可浏览器浏览的API特别有用,我们将在本教程的后面看到。
  • 也可以通过使用ModelSerializer类来节省时间,就像ModelForm一样。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值