出于本教程的目的,我们将首先创建一个Snippet
用于存储代码片段的简单模型。编辑app/models.py
文件。注意:良好的编程实践包括注释。
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)
#最长是100字节,允许为空,默认为空
title = models.CharField(max_length=100, blank=True, default='')
#文本字段
code = models.TextField()
#布尔字段,默认是False
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',)
我们还需要为我们的代码段模型创建初始迁移,并首次同步数据库(需要在项目文件夹下,即有项目的manage.py的文件夹下)。
上面一步比较麻烦,如果是用pycharm,那么在tools里面的有一个run manage.p Task....点击运行,在下面就会有命令行。并且不需要输入python manage.py这段,直接输入后面的。
我们需要开始使用Web API的第一件事是提供一种将代码段实例序列化和反序列化为表示形式的方法json
。我们可以通过声明与Django表单非常相似的序列化器来完成此操作。在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):
"""
创建并返回一个新的“Snippet”实例,并给出经过验证的数据
"""
return Snippet.objects.create(**validated_data)
def update(self, instance, validated_data):
"""
更新并返回一个现有的“Snippet”实例,并给出经过验证的数据。
"""
#从验证完的数据中取出相对应的值,如果没有,那就为instance(实例)里面的值
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
instance.save()
return instance
上面这个虽然麻烦,但是可以弄明白restfull序列化的原理以及流程:
1.先创建一个序列化的类,为序列化做准备
2. 从数据库中取出,然后进行序列化。
3.把序列化的值进行验证,并返回
我们实际上也可以通过使用ModelSerializer
类来节省一些时间,接下来会看到。上面是序列化程序定义的显式。
我们SnippetSerializer
班正在复制Snippet
模型中也包含的大量信息。如果我们能够使代码更简洁,那将是很好的。
与Django提供Form
类和ModelForm
类的方式相同,REST框架包括Serializer
类和ModelSerializer
类。
把上面的SnippetSerializer类进行更改
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ('id', 'title', 'code', 'linenos', 'language', 'style')
此时弄懂了restfull的序列化。
重要的是要记住ModelSerializer
类没有做任何特别神奇的事情,它们只是创建序列化程序类的快捷方式:
create()
和update()
方法的简单默认实现。()