Django与restfull 之Ⅱ

(什么是restfull的序列化,一般是json格式与前端进行数据交换)

创建一个可以使用的模型

出于本教程的目的,我们将首先创建一个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这段,直接输入后面的。

 

创建一个Serializer类

我们需要开始使用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类来节省一些时间,接下来会看到。上面是序列化程序定义的显式。

使用ModelSerializers

我们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()方法的简单默认实现。()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值