python django rest framework Serialization 的学习
2017-11-03 15:03
691 查看
创建一个新的app
python manage.py startapp snippets
修改settings文件
注意:使用Django <1.9,则需要用snippets替换snippets.apps.SnippetsConfig。INSTALLED_APPS = ( ... 'rest_framework', 'snippets.apps.SnippetsConfig', )
创建一个模型对象
编辑snippets/models.pyfrom 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',)
同步数据库
python manage.py makemigrations snippets python manage.py migrate
创建序列化类
编辑snippets/serializers.py(没有的话自行创建)from rest_framework import serializers from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES 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
使用序列化类
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() serializer = SnippetSerializer(snippet) serializer.data # {'id': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, # 'language': u'python', 'style': u'friendly'} # 为了完成序列化过程,我们把数据转换成json。 content = JSONRenderer().render(serializer.data) content # '{"id": 2, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": # false, "language": "python", "style": "friendly"}' # 反序列化 from django.utils.six import BytesIO stream = BytesIO(content) data = JSONParser().parse(stream) serializer = SnippetSerializer(data=data) serializer.is_valid() # True serializer.validated_data # OrderedDict([('title', ''), ('code', 'print "hello, world"\n'), ('linenos', # False), ('language', 'python'), ('style', 'friendly')]) serializer.save() # <Snippet: Snippet object> 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')]), # OrderedDict([('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')])]
使用ModelSerializers
修改 serializers.py中的文件如下class SnippetSerializer(serializers.ModelSerializer): # 需要注意一下这里不再是serializers.Serializer而是serializers.ModelSerializer class Meta: model = Snippet fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
使用我们的序列化程序编写常规的Django视图
编辑snippets/views.pyfrom django.http import HttpResponse, JsonResponse from django.views.decorators.csrf import csrf_exempt from rest_framework.renderers import JSONRenderer from rest_framework.parsers import JSONParser from snippets.models import Snippet from snippets.serializers import SnippetSerializer @csrf_exempt def snippet_list(request): """ List all code snippets, or create a new snippet. """ if request.method == 'GET': snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True) return JsonResponse(serializer.data, safe=False) elif request.method == 'POST': data = JSONParser().parse(request) serializer = SnippetSerializer(data=data) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data, status=201) return JsonResponse(serializer.errors, status=400) @csrf_exempt def snippet_detail(request, pk): """ Retrieve, update or delete a code snippet. """ 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) elif request.method == 'PUT': data = JSONParser().parse(request) serializer = SnippetSerializer(snippet, data=data) if serializer.is_valid(): serializer.save() return JsonResponse(serializer.data) return JsonResponse(serializer.errors, status=400) elif request.method == 'DELETE': snippet.delete() return HttpResponse(status=204)
修改urls
编辑snippets/urls.pyurlpatterns = [ url(r'^snippets/$', views.snippet_list), url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail), ]
编辑tutorial/urls.py
from django.conf.urls import url, include urlpatterns = [ url(r'^', include('snippets.urls')), ]
测试运行
退出 shell启动项目
1.通过http访问,安装httpie
pip install httpie访问
http http://127.0.0.1:8000/snippets/
结果
相关文章推荐
- Django 之REST framework学习1:Serialization(序列化)
- Django-rest-framework学习(-)Serialization
- Django 之REST framework学习:解析器parser的使用
- python django rest framework Authentication & Permissions
- Django-rest-framework学习(二)Request与Response
- python调试django-rest-framework API的小工具--httpie
- Django 之REST framework学习:序列化的几种方式
- Django 之REST framework学习5:关联性和超链接API(Relationships & Hyperlinked APIs)
- Python Django rest_framework
- Django 之REST framework学习:Authentication认证流程源码剖析
- 学习django-rest-framework turorial遇到的坑
- Django 之REST framework学习7:Schemas & client libraries
- python django rest framework Relationships & Hyperlinked APIs
- Django 之REST framework学习3:CBV
- django rest_framework 学习
- Django-Rest-Framework 教程: 1. 序列化 (Serialization)
- python django rest framework request and response
- Python3+PyCharm+Django+Django REST framework开发教程
- Vue+Django REST framework打造生鲜电商项目:学习过程之报错信息
- Django 之REST framework学习4:认证和权限(Authentication & Permissions)