一.新建立工程和app
django-admin.py startproject tutorial
cd tutorial
python manage.py startapp snippets
二.配置数据库
DATABASES ={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':'tmp.db','USER':'','PASSWORD':'','HOST':'','PORT':'',}}
三.配置settings.py,将新建的app添加进来
INSTALLED_APPS =(...'rest_framework','snippets',)
四.配置URL
urlpatterns = patterns('', url(r'^', include('snippets.urls')),)
五.创建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, blank=True, 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)
classMeta:
ordering =('created',)
注意rest3.0 和 2.0版本的不一样,比如widget要用style来表示。Field要用ReadOnlyField来表示
然后同步数据库
python manage.py syncdb
七.建立一个序列化Serializer的类
我们需要为 Web API 提供序列化和逆序列化方法,用像 json 这样的数据格式来表现 snippet 数据模型。我们可以像Django的表单类那样来声明序列化器类。在 app snippets 目录下建立一个名为 serializers.py 的文件,在该文件中键入:
from django.forms import widgets
from rest_framework import serializers
from snippets.models importSnippet, LANGUAGE_CHOICES, STYLE_CHOICES
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=LANGUAGE_CHOICES,
default='python')
style = serializers.ChoiceField(choices=STYLE_CHOICES,
default='friendly')
def restore_object(self, attrs, instance=None):
"""
Create or update a new snippet instance, given a dictionary
of deserialized field values.
创建或者更新一个新的 snippet 实例,需要一个字典,该字典包含逆序列化域的值。
Note that if we don't define this method, then deserializing
data will simply return a dictionary of items.
如果我们没有定义改方法,纳秒逆序列化数据只会简单地返回一个项目字典
"""
if instance:# Update existing instance
instance.title = attrs.get('title', instance.title)
instance.code = attrs.get('code', instance.code)
instance.linenos = attrs.get('linenos', instance.linenos)
instance.language = attrs.get('language', instance.language)
instance.style = attrs.get('style', instance.style)
return instance
# Create new instancereturnSnippet(**attrs)
return Snippet(**attrs)
关于序列化类的理解:
该序列化器类的第一部分定义了需要序列化和逆序列化的域。restore_object方法定义了怎样用逆序列化的数据来创建一个新的实例。
注意:我们同样可以使用其他更多的用在表单中的属性,像 widget(3.0用style)=weidgets.Textarea。这些属性可以用来控制序列化器渲染一个 HTML 表单的行为,尤其对显示可浏览的 API 有用,这个我们会在后面的教程中看到。
我们可以用ModelSerializer类来快速生成,但是现在我们会显示地定义序列化器。
八.查看序列化是如何工作的
python manage.py shell
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
snippet =Snippet(code='foo = "bar"\n')
snippet.save()
snippet =Snippet(code='print "hello, world"\n')
snippet.save()
上面创建一个snippets实例
获取snippets实例,查看序列化的效果:
serializer =SnippetSerializer(snippet) serializer.data# {'pk': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'}
上面我们将 模型的实例转换成Python数据类型。我们用序列化器将其渲染成 json:
content =JSONRenderer().render(serializer.data) content# '{"pk": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false, "language": "python", "style": "friendly"}'
九.逆序列化
逆序列化是类似的,首先我们解析数据流,将其转成Python数据类型。
==JSONParser().parse(stream)
然后存储Python数据类型到对象实例中去。
serializer =SnippetSerializer(data=data) serializer.is_valid() # Trueserializer.object #
注意这些API和django表单的相似处。这些相似点, 在我们讲述在view中使用serializers时将更加明显。
我么也可以序列化 querysets,只需要简单的加上 many = True。
serializer =SnippetSerializer(Snippet.objects.all(), many=True) serializer.data# [{'pk': 1, 'title': u'', 'code': u'foo = "bar"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'}, {'pk': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'}]