django rest frame work 初步使用 >> 序列化

>> 按照官网创建prject + app

 

Part 1. 序列化:

(把数据库数据转化成特定格式json, 个人理解)

采用原生的序列化方法:

def publisher_list(request):
    queryset = Publisher.objects.all()

    data = []
    # [方法一] user self to convert
    for i in queryset:
         p_tmp = {
             'name': i.name,
             'address': i.address
         }
         data.append(p_tmp)

    # [方法二] use django form, 但是很多    
    from django.froms.models import model_to_dict
    for i in queryset:
        data.append(model_to_dict(i))

    import json
    return HttpResponse(json.dumps(data), content_type="application/json")

    # [方法三] use django 自带的序列化
    from django.core import serializers
    data = serializers.serialize("json", queryset)
    return HttpResponse(data, content_type="application.json")
django 原生序列化

 

采用django-rest-framework 序列化:

# create file "serializers" in <app>

from rest_framework import serializers
from helloworld.models import Publisher

class PublisherSerializer(serializers.Serializer):
    # 类名:表名+"Serializer"
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=32)
    address = serializers.CharField(max_length=128)

    def create(self, validated_data):
        ## 重新定义 create
        # validated_data is dict
        return Publisher.objects.create(**validated_data)

    def update(self, instance, validated_data):
        ## 重新定义 update
        instance.name = validated_data.get("name", instance.name)
        instance.address = validated_data.get("address", instance.address)
        instance.save()
        return instance
rest_framework
from rest_framework import serializers
from helloworld.models import Publisher

# 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):
#         # validated_data is dict
#         return 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


class PublisherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Publisher
        fields = (
            "id",
            "name",
            "address"
        )
ModelSerializer

 

使用方法:

# 从 DB  >> json
from <app>.models import Publisher
form <app>.serializers import PublisherSerializer

p1 = Publiser.objects.first()
s1 = PublisherSerializer(p1)

s1.data
# Out[6]: {'id': 1, 'name': 'AAA', 'address': '3-103'}


#--------------------------------------
# 从json >> DB (create) 
from <app>.models import Publisher
form <app>.serializers import PublisherSerializer

p2 = {'name': 'ZZZ', 'address': '18-103'}

s2 = PublisherSerializer(data=p2)

# s2.is_valid()
Out[4]: True

# s2.validated_data
Out[5]: OrderedDict([('name', 'ZZZ'), ('address', '18-103')])

# s2.save()
Out[6]: <Publisher: ZZZ>
rest 序列化使用方法
def publisher_list(request):

    queryset = Publisher.objects.all()

    from helloworld.serializers import PublisherSerializer

    s = PublisherSerializer(queryset, many=True)
    # s.data >> 大列表, 用户返回。

    import json
    return HttpResponse(json.dumps(s.data), content_type="application/json")
views 使用rest 序列化

 

posted @ 2018-08-21 19:28  小小Guido妹  阅读(134)  评论(0编辑  收藏  举报