使用Django REST Framework来实现API
我是箕牧和广,在未来电子技术的实习生。这次我打算写关于Django REST Framework。
我是一个编程初学者,所以内容可能存在错误。
如果有错误,请指出并帮助我修正。
Django REST Framework是什么?
能够支持在Django中开发Web API的库。在库的标准支持下,可以开发出符合RESTful API的应用程序。
迅速安装
安装所需的库。
$ pip install django
$ pip install djangorestframework
$ pip install django-filter
创建项目应用程序。
# django_rest_framework_testという名前でプロジェクトを作ってみます
$ django-admin startproject django_rest_framework_test
$ cd django_rest_framework_test/
$ python manage.py startapp blog
# ディレクトリ構造確認
.
└── django_rest_framework_test
├── blog
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── django_rest_framework_test
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
模型的定义 de
from django.db import models
class User(models.Model):
name = models.CharField(max_length=32)
mail = models.EmailField()
class Entry(models.Model):
STATUS_DRAFT = "draft"
STATUS_PUBLIC = "public"
STATUS_SET = (
(STATUS_DRAFT, "下書き"),
(STATUS_PUBLIC, "公開中"),
)
title = models.CharField(max_length=128)
body = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
status = models.CharField(choices=STATUS_SET, default=STATUS_DRAFT, max_length=8)
author = models.ForeignKey(User, related_name='entries', on_delete=models.CASCADE)
定义一个只包含姓名和电子邮件的用户(User),以及表示博客文章的条目(Entry)。使用外键(ForeignKey)在条目(Entry)中引用用户(User)以获取博客作者的信息。
数据库建设
…
# blogを追記
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
…
# migrationファイルを作る
$ python manage.py makemigrations
# migrationファイルを元にDBに反映する
$ python manage.py migrate
添加用户自定义模型。
from django.contrib import admin
from .models import User, Entry
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
pass
@admin.register(Entry)
class Entry(admin.ModelAdmin):
pass
确认行动
# admin用のユーザー作成
$ python manage.py createsuperuser
Username (leave blank to use 'kimihiro_n'): dev
Email address:
Password:
Password (again):
# 開発サーバーを起動
$ python manage.py runserver
可以通过 http://localhost:8000/admin 进入Django的管理页面。
到此为止,常规的Django流程就结束了。
将Django REST Framework集成进来
加载REST框架
INSTALLED_APPS = (
...
'blog',
'rest_framework',
)
序列化器的定义
# coding: utf-8
from rest_framework import serializers
from .models import User, Entry
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('name', 'mail')
class EntrySerializer(serializers.ModelSerializer):
class Meta:
model = Entry
fields = ('title', 'body', 'created_at', 'status', 'author')
继承serializers.ModelSerializer以创建与模型对应的序列化器。在fields参数中以元组的形式提供要输出为API的字段名。列出的字段将以默认实现进行序列化和输出。
ViewSet的定义
# coding: utf-8
import django_filters
from rest_framework import viewsets, filters
from .models import User, Entry
from .serializer import UserSerializer, EntrySerializer
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class EntryViewSet(viewsets.ModelViewSet):
queryset = Entry.objects.all()
serializer_class = EntrySerializer
指定一个Django Model的查询集到queryset,指定之前定义的Serializer到serializer_class。你也可以预先对查询集进行筛选。
URL模式定义
# coding: utf-8
from django.conf.urls import url, include
from django.contrib import admin
from blog.urls import router as blog_router
urlpatterns = [
url(r'^admin/', admin.site.urls),
# blog.urlsをincludeする
url(r'^api/', include(blog_router.urls)),
]
# coding: utf-8
from rest_framework import routers
from .views import UserViewSet, EntryViewSet
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'entries', EntryViewSet)
最后是URL模式的定义。使用名为router的工具,按照每个模型进行注册。
如果按照上述设置进行配置,则/api/将成为访问REST API的入口,GET /api/users/可获得用户列表,GET /api/entries/可访问条目列表。
确认API操作
现在可以运行REST API了。
python manage.py runserver
启动服务器,并访问http://localhost:8000/api/。