# rest-framework教程 - settings.py INSTALL-APPS = [ 'snippets', # app 'rest-framework', ] - 创建model # -*- coding: utf-8 -*- from __future__ import unicode_literals 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) class Meta: ordering = ('created',) - 创建serializer 麻烦 # -*- coding: utf-8 -*- from rest_framework import serializers from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES # 不继承ModelSerializer, 自己定义create, update,这两个函数在SnippetSerializer对象.save()执行事被调用 class SnippetSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) title = serializers.CharField(required=False, allow_blank=True, max_length=100) code = serializers.CharField(style={'base_template': 'textarea.html'}) linenos = serializers.BooleanField(required=False) language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python') style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly') def create(self, validated_data): """ Create and return a new `Snippet` instance, given the validated data. """ return Snippet.objects.create(**validated_data) def update(self, instance, validated_data): """ Update and return an existing `Snippet` instance, given the validated data. """ instance.title = validated_data.get('title', instance.title) instance.code = validated_data.get('code', instance.code) instance.linenos = validated_data.get('linenos', instance.linenos) instance.language = validated_data.get('language', instance.language) instance.style = validated_data.get('style', instance.style) instance.save() return instance - 创建Serializer,简便 class SnippetSerializer(serializers.ModelSerializer): class Meta: model = Snippet fields = ('id', 'title', 'code', 'linenos', 'language', 'style') # 和上面是一样的,ModelSerializer里面定义了create,update方法 # 不信你执行下面语句 serializer = SnippetSerializer() print(repr(serializer)) - 添加数据(添加两条数据) python manage.py shell >>>from snippets.models import Snippet >>> snippet = Snippet(code='foo = "bar"\n') >>> snippet.save() >>> >>> >>> snippet = Snippet(code='print "hello, world"\n') >>> snippet.save() - 使用serializer 得到dict数据 : serializer对象.data >>> snippet = Snippet.objects.all()[1] >>> serializer = SnippetSerializer(snippet) >>> serializer.data {'style': 'friendly', 'code': u'print "hello, world"\n', 'language': 'python', 'title': u'', 'linenos': False, 'id': 2} - 使用serializer得到Json数据 --序列化 >>> from rest_framework.renderers import JSONRenderer >>> snippet = Snippet.objects.all()[1] >>> serializer = SnippetSerializer(snippet) >>> content= JSONRenderer().render(serializer.data) >>> content '{"id":2,"title":"","code":"print \\"hello, world\\"\\n","linenos":false,"language":"python","style":"friendly"}' >>> - 使用serializer反序列化得到字典数据 >>> from rest_framework.renderers import JSONRenderer >>> content= JSONRenderer().render(serializer.data) >>> content '{"id":2,"title":"","code":"print \\"hello, world\\"\\n","linenos":false,"language":"python","style":"friendly"}' >>> from rest_framework.parsers import JSONParser >>> data = JSONParser().parse(content) # 会报错,因为content不是句柄(可读) AttributeError: 'str' object has no attribute 'read' >>> f = open('a.data','wb') >>> f.write(content) >>> f.close() >>> f = open('a.data','rb') >>> data = JSONParser().parse(f) >>> data {u'style': u'friendly', u'code': u'print "hello, world"\n', u'language': u'python', u'title': u'', u'linenos': False, u'id': 2} - 使用serializer插入数据 -- data为上面的data >>> serializer = SnippetSerializer(data=data) # 相当于插入数据 >>> serializer.is_valid() True >>> serializer.validated_data OrderedDict([(u'title', u''), (u'code', u'print "hello, world"'), (u'linenos', False), (u'language', 'python'), (u'style', 'friendly')]) >>> serializer.save() <Snippet: Snippet object> # 数据库保存, 查看数据库会发现已经多了一条数据 - 将多个对象序列化many=True >>> serializer = SnippetSerializer(Snippet.objects.all(), many=True) >>> serializer.data [OrderedDict([('id', 1), ('title', u''), ('code', u'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), Orde redDict([('id', 2), ('title', u''), ('code', u'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 3), ('title', u''), ('code', u'print "hello, world"'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]) ] - 创建views -- 工程.url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', include('snippets.urls')), ] -- snippets.url urlpatterns = [ url(r'^snippets/$', views.snippet_list), url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail), ] -- 视图函数 # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.shortcuts import render, HttpResponse from django.http import JsonResponse from snippets.models import Snippet from snippets.serializer import SnippetSerializer # Create your views here. def snippet_list(request): if request.method == 'GET': snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True) return JsonResponse(serializer.data, safe=False) def snippet_detail(request, pk): try: snippet = Snippet.objects.get(pk=pk) except Snippet.DoesNotExist: return HttpResponse(status=404) if request.method == 'GET': serializer = SnippetSerializer(snippet) return JsonResponse(serializer.data)
相关文章: