DRF是分两阶段进行的。
如果是API接收数据,则是先进行Parser,将外界接收的bytes数据分析成python数据类型,其间涉及encoding操作,再进行序列化,将python数据类型保存进数据库。
如果是从API获取数据,则是先进行反序列化,将数据库中的数据转成python数据类型,再进行renderer,将python数据类型渲染成可用于网络传输的byte类型。
实践的代码如下:
models.py
from django.db import models # Create your models here. class Toy(models.Model): created = models.DateTimeField(auto_now_add=True) name = models.CharField(max_length=150, blank=False, default='') description = models.CharField(max_length=250, blank=True, default='') toy_category = models.CharField(max_length=200, blank=False, default='') release_date = models.DateTimeField() was_included_in_home = models.BooleanField(default=False) class Meta: ordering = ('name', )
serializers.py
from rest_framework import serializers from toys.models import Toy class ToySerializer(serializers.Serializer): pk = serializers.ImageField(read_only=True) name = serializers.CharField(max_length=150) description = serializers.CharField(max_length=250) toy_category = serializers.CharField(max_length=200) release_date = serializers.DateTimeField() was_included_in_home = serializers.BooleanField(required=False) def create(self, validated_data): return Toy.objects.create(**validated_data) def update(self, instance, validated_data): instance.name = validated_data('name', instance.name) instance.description = validated_data('description', instance.description) instance.toy_category = validated_data('toy_category', instance.toy_category) instance.release_date = validated_data('release_date', instance.release_date) instance.was_included_in_home = validated_data('was_included_in_home', instance.was_included_in_home) instance.save() return instance
python manage.py shell实践。
from datetime import datetime from django.utils import timezone from django.utils.six import BytesIO from rest_framework.renderers import JSONRenderer from rest_framework.parsers import JSONParser from toys.models import Toy from toys.serializers import ToySerializer toy_release_date = timezone.make_aware(datetime.now(), timezone.get_current_timezone()) toy1 = Toy(name='Snoopy talking action figure', description='Snoopy speaks five languages', release_date=toy_release_date, toy_category='Action figures', was_included_in_home=False) toy1.save() toy2 = Toy(name='Hawaiian Barbie', description='Barbie loves Hawaii', release_date=toy_release_date, toy_category='Dolls', was_included_in_home=True) toy2.save() serializer_for_toy1 = ToySerializer(toy1) print(serializer_for_toy1.data) serializer_for_toy2 = ToySerializer(toy2) print(serializer_for_toy2.data) json_renderer = JSONRenderer() toy1_rendered_into_json = json_renderer.render(serializer_for_toy1.data) toy2_rendered_into_json = json_renderer.render(serializer_for_toy2.data) print(toy1_rendered_into_json) print(toy2_rendered_into_json) json_string_for_new_toy = '{"name":"Clash Royale play set","description":"6 figures from Clash Royale", "release_date":"2017-10-09T12:10:00.776594Z","toy_category":"Playset","was_included_in_home":false}' json_bytes_for_new_toy = bytes(json_string_for_new_toy, encoding="UTF-8") stream_for_new_toy = BytesIO(json_bytes_for_new_toy) parser = JSONParser() parsed_new_toy = parser.parse(stream_for_new_toy) print(parsed_new_toy) new_toy_serializer = ToySerializer(data=parsed_new_toy) if new_toy_serializer.is_valid(): toy3 = new_toy_serializer.save() print(toy3.name)