序列化Serialization
1. 设置一个新的环境 在我们开始之前, 我们首先使用virtualenv要创建一个新的虚拟环境,以使我们的配置和我们的其他项目配置彻底分开。 现在我们处在一个虚拟的环境中,开始安装我们的依赖包 $pip install django $pip install djangorestframework $pip install pygments 使用这个包,做代码高亮显示 需要退出虚拟环境时,运行deactivate。更多信息,irtualenv document 2. 开始 环境准备好只好,我们开始创建我们的项目 $ cd ~ $ django-admin.py startproject tutorial $ cd tutorial 项目创建好后,我们再创建一个简单的app $python manage.py startapp snippets 我们使用sqlite3来运行我们的项目tutorial,编辑tutorial/settings.py, 将数据库的默认引擎engine改为sqlite3, 数据库的名字NAME改为tmp.db DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': 'tmp.db', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } } 同时更改settings.py文件中的INSTALLD_APPS,添加我们的APP snippets和rest_framework INSTALLED_APPS = ( ... 'rest_framework', 'snippets', ) 在tutorial/urls.py中,将snippets app的url包含进来 urlpatterns = patterns('', url(r'^', include('snippets.urls')), ) 3. 创建Model 这里我们创建一个简单的nippets model,目的是用来存储代码片段。 from django.db import models from pygments.lexers import get_all_lexers from pygments.styles import get_all_styles LEXERS = [item for item in get_all_lexers() if item[1]] LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS]) STYLE_CHOICES = sorted((item, item) for item in get_all_styles()) class Snippet(models.Model): created = models.DateTimeField(auto_now_add=True) title = models.CharField(max_length=100, default='') code = models.TextField() linenos = models.BooleanField(default=False) language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100) style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100) class Meta: ordering = ('created',) 完成model时,记得sync下数据库 python manage.py syncdb 4. 创建序列化类 我们要使用我们的web api,要做的第一件事就是序列化和反序列化, 以便snippets实例能转换为可表述的内容,例如json. 我们声明一个可有效工作的串行器serializer。在snippets目录下面,该串行器与django 的表单形式很类似。创建一个serializers.py ,并将下面内容拷贝到文件中。 from django.forms import widgets from rest_framework import serializers from snippets.models import Snippet class SnippetSerializer(serializers.Serializer): pk = serializers.Field() # Note: `Field` is an untyped read-only field. title = serializers.CharField(required=False, max_length=100) code = serializers.CharField(widget=widgets.Textarea, max_length=100000) linenos = serializers.BooleanField(required=False) language = serializers.ChoiceField(choices=models.LANGUAGE_CHOICES, default='python') style = serializers.ChoiceField(choices=models.STYLE_CHOICES, default='friendly') def restore_object(self, attrs, instance=None): """ Create or update a new snippet instance. """ if instance: # Update existing instance instance.title = attrs['title'] instance.code = attrs['code'] instance.linenos = attrs['linenos'] instance.language = attrs['language']