Python的Django REST框架中的序列化及请求和返回

序列化Serialization
1. 设置一个新的环境
在我们开始之前, 我们首先使用virtualenv要创建一个新的虚拟环境,以使我们的配置和我们的其他项目配置彻底分开。   

Python的Django REST框架中的序列化及请求和返回_python
现在我们处在一个虚拟的环境中,开始安装我们的依赖包
    
$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']