# 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)

    
View Code

相关文章:

猜你喜欢
相关资源
相似解决方案