<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Django_RESTful_api</id>
	<title>Django RESTful api - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.linuxsa.org/index.php?action=history&amp;feed=atom&amp;title=Django_RESTful_api"/>
	<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Django_RESTful_api&amp;action=history"/>
	<updated>2026-04-23T10:49:30Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.linuxsa.org/index.php?title=Django_RESTful_api&amp;diff=283&amp;oldid=prev</id>
		<title>2024年11月5日 (二) 06:27 Evan</title>
		<link rel="alternate" type="text/html" href="https://wiki.linuxsa.org/index.php?title=Django_RESTful_api&amp;diff=283&amp;oldid=prev"/>
		<updated>2024-11-05T06:27:20Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:django]] &lt;br /&gt;
&lt;br /&gt;
=相关站点=&lt;br /&gt;
[https://q1mi.github.io/Django-REST-framework-documentation/ Django REST framework 中文文档]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/xingjidemimi/article/details/86694280  Django+RestFramework实现API接口及接口文档并返回json数据]&lt;br /&gt;
&lt;br /&gt;
代码 https://github.com/xingjidemimi/DjangoAPI  感觉不错&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/weixin_43420032/article/details/94631231  【python】django开发API接口]&lt;br /&gt;
&lt;br /&gt;
=pre=&lt;br /&gt;
&lt;br /&gt;
[https://www.w3school.com.cn/json/index.asp JSON 教程 w3school]&lt;br /&gt;
&lt;br /&gt;
[https://www.w3school.com.cn/ajax/index.asp www.w3school AJAX 教程]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REST framework requires the following:&lt;br /&gt;
&lt;br /&gt;
    Django (4.2, 5.0)&lt;br /&gt;
    Python (3.8, 3.9, 3.10, 3.11, 3.12)&lt;br /&gt;
&lt;br /&gt;
https://www.django-rest-framework.org/#requirements&lt;br /&gt;
&lt;br /&gt;
=知识点 =&lt;br /&gt;
　RESTful API现在很流行，这里是它的介绍 [http://www.ruanyifeng.com/blog/2011/09/restful.html 理解RESTful架构] 和   [http://www.ruanyifeng.com/blog/2014/05/restful_api.html RESTful API设计指南].&lt;br /&gt;
按照Django的常规方法当然也可以实现REST，但有一种更快捷、强大的方法，那就是 Django REST framework.它是python的一个模块，通过在Django里面配置就可以把app的models中的各个表实现RESTful API&lt;br /&gt;
&lt;br /&gt;
=序列化=&lt;br /&gt;
什么是序列化？序列化有什么作用？&lt;br /&gt;
[https://www.jianshu.com/p/407c6264c4e8 django 为什么要序列化-非常好的教程]&lt;br /&gt;
&lt;br /&gt;
[https://www.jianshu.com/p/1e404604d5c3 Django实战003:为什么使用Serializer序列化器 有空要细细操作品味一下]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Python类型数据序列化(serialization)&lt;br /&gt;
&lt;br /&gt;
每种编程语言都有各自的数据类型, 将属于自己语言的数据类型或对象转换为可通过网络传输或可以存储到本地磁盘的数据格式（如：XML、JSON或特定格式的字节串）的过程称为序列化(seralization)；反之则称为反序列化。API开发的本质就是各种后端语言的自己的数据类型序列化为通用的可读可传输的数据格式，比如常见的JSON类型数据。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
过滤信息（Filtering）&lt;br /&gt;
&lt;br /&gt;
如果记录数量很多，服务器不可能都将它们返回给用户。符合RESTful规范的API应该支持过滤。下面是一些常见的过滤参数。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
on django &lt;br /&gt;
&lt;br /&gt;
Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户，特别的Ajax请求一般返回的为Json格式&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/weixin_42575020/article/details/81541603  怎么理解django中的序列化]&lt;br /&gt;
&lt;br /&gt;
on python&lt;br /&gt;
&lt;br /&gt;
为什么要序列化&lt;br /&gt;
&lt;br /&gt;
我们把变量从内存中变成可存储或传输的过程称之为序列化&lt;br /&gt;
&lt;br /&gt;
在程序运行的过程中，所有的变量都是在内存中，比如，定义一个dict：&lt;br /&gt;
&lt;br /&gt;
d = dict(name=&amp;#039;Bob&amp;#039;, age=20, score=88)&lt;br /&gt;
&lt;br /&gt;
可以随时修改变量，比如把name改成&amp;#039;Bill&amp;#039;，但是一旦程序结束，变量所占用的内存就被操作系统全部回收。如果没有把修改后的&amp;#039;Bill&amp;#039;存储到磁盘上，下次重新运行程序，变量又被初始化为&amp;#039;Bob&amp;#039;。&lt;br /&gt;
&lt;br /&gt;
我们把变量从内存中变成可存储或传输的过程称之为序列化，在Python中叫pickling，在其他语言中也被称之为serialization，marshalling，flattening等等，都是一个意思。&lt;br /&gt;
&lt;br /&gt;
序列化之后，就可以把序列化后的内容写入磁盘，或者通过网络传输到别的机器上。&lt;br /&gt;
&lt;br /&gt;
反过来，把变量内容从序列化的对象重新读到内存里称之为反序列化，即unpickling。&lt;br /&gt;
Python提供了pickle模块来实现序列化。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In [1]: import pickle                                               &lt;br /&gt;
&lt;br /&gt;
In [2]: d=dict(name=&amp;#039;bob&amp;#039;,age=20,score=88)                          &lt;br /&gt;
&lt;br /&gt;
In [3]: pickle.dumps(d)                                             &lt;br /&gt;
Out[3]: b&amp;#039;\x80\x04\x95$\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03bob\x94\x8c\x03age\x94K\x14\x8c\x05score\x94KXu.&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In [5]: import json                                                 &lt;br /&gt;
&lt;br /&gt;
In [6]: json.dumps(d)                                               &lt;br /&gt;
Out[6]: &amp;#039;{&amp;quot;name&amp;quot;: &amp;quot;bob&amp;quot;, &amp;quot;age&amp;quot;: 20, &amp;quot;score&amp;quot;: 88}&amp;#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
小结&lt;br /&gt;
&lt;br /&gt;
Python语言特定的序列化模块是pickle，但如果要把序列化搞得更通用、更符合Web标准，就可以使用json模块。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://www.liaoxuefeng.com/wiki/1016959663602400/1017624706151424 廖雪峰py序列化]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
内存中的字典、列表、集合以及各种对象，如何保存到一个文件中。&lt;br /&gt;
&lt;br /&gt;
设计一套协议，按照某种规则，把内存中的数据保存到文件中，文件是一个个字节序列。所以必须把数据额转换为字节序列，输出到文件，这就是序列化，反之，从文件的字节 序列恢复到内存中，就是反序列化。&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
1、定义&lt;br /&gt;
&lt;br /&gt;
Serialization系列化，将内存中对象存储下来，把他变成一个个字节。二进制。&lt;br /&gt;
&lt;br /&gt;
deSerialization反序列化，将文件的一个个字节到内存中。&lt;br /&gt;
&lt;br /&gt;
序列化保存到文件就是持久化。&lt;br /&gt;
&lt;br /&gt;
可将数据序列化后持久化，或者网络传输，也可以将文件中或者网络接受到的字节序列反序列化&lt;br /&gt;
&lt;br /&gt;
=django模型类序列化器 ModelSerializer=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. 定义&lt;br /&gt;
比如我们创建一个BookInfoSerializer&lt;br /&gt;
&lt;br /&gt;
class BookInfoSerializer(serializers.ModelSerializer):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;图书数据序列化器&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    class Meta:&lt;br /&gt;
        model = BookInfo&lt;br /&gt;
        fields = &amp;#039;__all__&amp;#039;&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
model 指明参照哪个模型类&lt;br /&gt;
fields 指明为模型类的哪些字段生成&lt;br /&gt;
2. 指定字段&lt;br /&gt;
1) 使用fields来明确字段，__all__表名包含所有字段，也可以写明具体哪些字段，如&lt;br /&gt;
&lt;br /&gt;
class BookInfoSerializer(serializers.ModelSerializer):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;图书数据序列化器&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    class Meta:&lt;br /&gt;
        model = BookInfo&lt;br /&gt;
        fields = (&amp;#039;id&amp;#039;, &amp;#039;btitle&amp;#039;, &amp;#039;bpub_date&amp;#039;)&lt;br /&gt;
 2) 使用exclude可以明确排除掉哪些字段&lt;br /&gt;
&lt;br /&gt;
class BookInfoSerializer(serializers.ModelSerializer):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;图书数据序列化器&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    class Meta:&lt;br /&gt;
        model = BookInfo&lt;br /&gt;
        exclude = (&amp;#039;image&amp;#039;,)&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
eg &lt;br /&gt;
class BookModelSerializer(serializers.ModelSerializer):&lt;br /&gt;
    class Meta:   # 写一个内部类&lt;br /&gt;
        model=models.Book   # 该序列化类跟哪个表建立关系&lt;br /&gt;
        fields = [&amp;#039;id&amp;#039;,&amp;#039;title&amp;#039;]  # 序列化哪些字段&lt;br /&gt;
        # fields = &amp;#039;__all__&amp;#039;  # 序列化全部字段&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/huwei_1993/article/details/81665426 django模型类序列化器 ModelSerializer]&lt;br /&gt;
&lt;br /&gt;
=过程 =&lt;br /&gt;
==install ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pip3 install djangorestframework #Django REST Framework&lt;br /&gt;
pip3 install markdown       # Markdown support for the browsable API.&lt;br /&gt;
pip3 install django-filter  # Filtering support&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==创建API==&lt;br /&gt;
&lt;br /&gt;
 python3  manage.py  startapp api #当然 得先创建项目 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
setting.py  添加 &lt;br /&gt;
INSTALLED_APPS = [&lt;br /&gt;
    &amp;#039;django.contrib.admin&amp;#039;,&lt;br /&gt;
    &amp;#039;django.contrib.auth&amp;#039;,&lt;br /&gt;
    &amp;#039;django.contrib.contenttypes&amp;#039;,&lt;br /&gt;
    &amp;#039;django.contrib.sessions&amp;#039;,&lt;br /&gt;
    &amp;#039;django.contrib.messages&amp;#039;,&lt;br /&gt;
    &amp;#039;django.contrib.staticfiles&amp;#039;,&lt;br /&gt;
    &amp;#039;rest_framework&amp;#039;,&lt;br /&gt;
    &amp;#039;api&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
REST_FRAMEWORK = {&lt;br /&gt;
    &amp;#039;DEFAULT_PERMISSION_CLASSES&amp;#039;: (&lt;br /&gt;
        &amp;#039;rest_framework.permissions.IsAuthenticated&amp;#039;,&lt;br /&gt;
    )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 数据库迁移&lt;br /&gt;
  python3 manage.py makemigrations&lt;br /&gt;
 python3 manage.py migrate&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
用我以前创建的可以用 &lt;br /&gt;
&lt;br /&gt;
创建数据&lt;br /&gt;
点击主页右上角的Log in登录超级管理员账户，然后分别创建Group和User数据&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
创建用户和组在这里 &lt;br /&gt;
&lt;br /&gt;
HTTP 200 OK&lt;br /&gt;
Allow: GET, HEAD, OPTIONS&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
Vary: Accept&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
    &amp;quot;users&amp;quot;: &amp;quot;http://127.0.0.1:8000/users/?format=api&amp;quot;,&lt;br /&gt;
    &amp;quot;groups&amp;quot;: &amp;quot;http://127.0.0.1:8000/groups/?format=api&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== files==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# 接下来需要做的就是创建 Serializer 类，类似于 Form。它的作用就是从你传入的参数中提取出你需要的数据，并把它转化为 json 格式(注意，已经是字节码了),同时支持反序列化到model对象。在 snippets 文件夹中添加 serializers.py 并在其添加如下：&lt;br /&gt;
# on api/serializers.py&lt;br /&gt;
&lt;br /&gt;
from django.contrib.auth.models import User,Group&lt;br /&gt;
from rest_framework import serializers&lt;br /&gt;
&lt;br /&gt;
class UserSerializer(serializers.HyperlinkedModelSerializer):&lt;br /&gt;
    class Meta:&lt;br /&gt;
        model=User&lt;br /&gt;
        fields=(&amp;#039;url&amp;#039;,&amp;#039;username&amp;#039;,&amp;#039;email&amp;#039;,&amp;#039;groups&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
class GroupSerializer(serializers.HyperlinkedModelSerializer):&lt;br /&gt;
    class Meta:&lt;br /&gt;
        model=Group&lt;br /&gt;
        fields=(&amp;#039;url&amp;#039;,&amp;#039;name&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
解说 &lt;br /&gt;
from rest_framework import serializers&lt;br /&gt;
from app01 import models&lt;br /&gt;
&lt;br /&gt;
class BookModelSerializer(serializers.ModelSerializer):&lt;br /&gt;
    class Meta:   # 写一个内部类&lt;br /&gt;
        model=models.Book   # 该序列化类跟哪个表建立关系&lt;br /&gt;
        fields = [&amp;#039;id&amp;#039;,&amp;#039;title&amp;#039;]  # 序列化哪些字段&lt;br /&gt;
        # fields = &amp;#039;__all__&amp;#039;  # 序列化全部字段&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#视图  on api/views.py&lt;br /&gt;
from django.shortcuts import render&lt;br /&gt;
from django.contrib.auth.models import User,Group&lt;br /&gt;
from rest_framework import viewsets&lt;br /&gt;
from api.serializers import UserSerializer,GroupSerializer&lt;br /&gt;
&lt;br /&gt;
# Create your views here.&lt;br /&gt;
class UserViewSet(viewsets.ModelViewSet):&lt;br /&gt;
    queryset = User.objects.all()&lt;br /&gt;
    serializer_class = UserSerializer&lt;br /&gt;
&lt;br /&gt;
class GroupViewSet(viewsets.ModelViewSet):&lt;br /&gt;
    queryset = Group.objects.all()&lt;br /&gt;
    serializer_class = GroupSerializer&lt;br /&gt;
# Create your views here.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#URL路由配置 项目名下的 /urls.py&lt;br /&gt;
&lt;br /&gt;
from django.contrib import admin&lt;br /&gt;
from django.urls import path&lt;br /&gt;
from django.conf.urls import include&lt;br /&gt;
from rest_framework import routers&lt;br /&gt;
from api import views&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
router=routers.DefaultRouter()&lt;br /&gt;
router.register(r&amp;#039;users&amp;#039;,views.UserViewSet)&lt;br /&gt;
router.register(r&amp;#039;groups&amp;#039;,views.GroupViewSet)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
urlpatterns = [&lt;br /&gt;
    path(&amp;#039;admin/&amp;#039;, admin.site.urls),&lt;br /&gt;
    path(&amp;#039;&amp;#039;,include(router.urls)),&lt;br /&gt;
    path(&amp;#039;api-auth/&amp;#039;,include(&amp;#039;rest_framework.urls&amp;#039;,namespace=&amp;#039;rest_framework&amp;#039;)),&lt;br /&gt;
    &lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=[[数据可视化图形展示pyecharts]]=&lt;br /&gt;
=troubleshooting=&lt;br /&gt;
troubleshooting &lt;br /&gt;
&lt;br /&gt;
ModuleNotFoundError: No module named &amp;#039;tutorial.quickstart&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
加上project nmae 有错呀 &lt;br /&gt;
urls.py  &lt;br /&gt;
from  quickstart import views&lt;br /&gt;
# from  tutorail.quickstart import views&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
views.py &lt;br /&gt;
from quickstart.serializers import UserSerializer, GroupSerializer&lt;br /&gt;
from tutorial.quickstart.serializers import UserSerializer, GroupSerializer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
INSTALLED_APPS = [&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    &amp;#039;rest_framework&amp;#039;,&lt;br /&gt;
    &amp;#039;quickstart&amp;#039;, &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
官方参考 文档 &lt;br /&gt;
https://www.django-rest-framework.org/tutorial/quickstart/#project-setup&lt;br /&gt;
&lt;br /&gt;
=2024=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
django-admin startproject tutorial1 .  # Note the trailing &amp;#039;.&amp;#039; character&lt;br /&gt;
cd tutorial1&lt;br /&gt;
django-admin startapp quickstart&lt;br /&gt;
cd ..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
代码&lt;br /&gt;
&lt;br /&gt;
github/django/drf/tutorial1&lt;br /&gt;
&lt;br /&gt;
参考官方 文档&lt;br /&gt;
https://www.django-rest-framework.org/tutorial/quickstart/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=应该是另外一个例子=&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/weixin_42134789/article/details/108138591 Django REST Framework教程(1): 为什么要学习DRF, 什么是序列化和RESTful的API]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://blog.csdn.net/xingjidemimi/article/details/86694280  Django+RestFramework实现API接口及接口文档并返回json数据]&lt;br /&gt;
&lt;br /&gt;
这种接口可能和得少 不过学习还是有用的&lt;br /&gt;
note &lt;br /&gt;
#on urls.py &lt;br /&gt;
from django.urls import path, include&lt;br /&gt;
&lt;br /&gt;
那个views_api 我放到views on apps(django_web)&lt;br /&gt;
&lt;br /&gt;
[https://www.cnblogs.com/liudinglong/p/12329425.html Django 单元测试笔记]&lt;br /&gt;
&lt;br /&gt;
[https://www.cnblogs.com/liudinglong/p/12333665.html Django Web接口开发]&lt;br /&gt;
&lt;br /&gt;
[https://zhuanlan.zhihu.com/p/102269279 如何借助 Django 来编写一个 Python Web API 其实就是官方restful]&lt;br /&gt;
&lt;br /&gt;
=see also=&lt;br /&gt;
[https://sutune.me/2018/07/20/django-restful-api/ good Django Restful接口开发与测试]&lt;br /&gt;
&lt;br /&gt;
[https://www.cnblogs.com/zhouyang123200/p/6606405.html  利用Django实现RESTful API(一) ]&lt;/div&gt;</summary>
		<author><name>Evan</name></author>
	</entry>
</feed>