django_rest_framework 简单的例子

开始

环境ubuntu 16.04 已经安装了 py2 和py3
目录:

cd /home/jack/django_rest/blog

python3 -m venv env

source env/bin/activate

python -V
Python 3.5.2

更新pip 版本
python -m pip install --upgrade pip 

pip install django

pip install djangorestframework

pip install django-filter 

pip list
Package             Version
------------------- -------
Django              2.2.6  
django-filter       2.2.0  
djangorestframework 3.10.3 
pip                 19.3.1 
pkg-resources       0.0.0  
pytz                2019.3 
setuptools          20.7.0 
sqlparse            0.3.0  

创建工程

django-admin startproject mblog
cd mblog/
python manage.py startapp mainsite
django_rest_framework 简单的例子_第1张图片

定义Model

vi mainsite/models.py

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)
设置 setting

vi mblog/settings.py

ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mainsite',
]

同步数据库

python manage.py makemigrations

python manage.py migrate

创建用户

python manage.py createsuperuser
admin
密码:123abc
django_rest_framework 简单的例子_第2张图片

启动服务器:

python manage.py runserver 192.168.99.218:8080

http://192.168.99.218:8080/
http://192.168.99.218:8080/admin/
django_rest_framework 简单的例子_第3张图片

添加 model

想要显示刚才添加的两个Model

vi mainsite/admin.py

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

效果:
django_rest_framework 简单的例子_第4张图片

使用Djagno REST Framework

vi mblog/settings.py

ALLOWED_HOSTS = ['*']


# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mainsite',
    'rest_framework'
]

定义Serialzier

vi mainsite/serializer.py

# 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')

定义ViewSet

vi mainsite/views.py

from django.shortcuts import render

# Create your views here.

# 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

定义URL pattern

vi mblog/urls.py

# coding: utf-8
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include

from mainsite.urls import router as mainsite_router

urlpatterns = [
    path('admin/', admin.site.urls),
    #include blog.urls
    url(r'^api/', include(mainsite_router.urls)),
]

vi mainsite/urls.py

# 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)

运行

python manage.py runserver 192.168.99.218:8080

http://192.168.99.218:8080/api/
django_rest_framework 简单的例子_第5张图片
http://192.168.99.218:8080/api/users/

django_rest_framework 简单的例子_第6张图片

实验

http://192.168.99.218:8080/admin/
添加Users
django_rest_framework 简单的例子_第7张图片
django_rest_framework 简单的例子_第8张图片
django_rest_framework 简单的例子_第9张图片
django_rest_framework 简单的例子_第10张图片
执行如下的连接:
http://192.168.99.218:8080/api/users/

django_rest_framework 简单的例子_第11张图片

在以上图片的post处,添加Name 和Mail
然后点击POST
django_rest_framework 简单的例子_第12张图片
django_rest_framework 简单的例子_第13张图片
再次 执行 如下连接:
http://192.168.99.218:8080/api/users/

django_rest_framework 简单的例子_第14张图片

测试 Entry

django_rest_framework 简单的例子_第15张图片

django_rest_framework 简单的例子_第16张图片

修改一下文件:
vi mainsite/serializer.py

class EntrySerializer(serializers.ModelSerializer):
    class Meta:
        model = Entry
        fields = ('title', 'body', 'created_at', 'status', 'author')

修改为:

class EntrySerializer(serializers.ModelSerializer):
    # author的serializer
    author = UserSerializer()

    class Meta:
        model = Entry
        fields = ('title', 'body', 'created_at', 'status', 'author')

django_rest_framework 简单的例子_第17张图片

分页:

vi mblog/settings.py

ALLOWED_HOSTS = ['*']

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 2
}

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mainsite',
    'rest_framework'
]

效果如下:
http://192.168.99.218:8080/api/users/

django_rest_framework 简单的例子_第18张图片

筛选 — 没有成功

vi mblog/settings.py

ALLOWED_HOSTS = ['*']

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 2,
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',),
}

# Application definition

vi mainsite/views.py

原来的:

class EntryViewSet(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer

修改后的:

class EntryViewSet(viewsets.ModelViewSet):
    queryset = Entry.objects.all()
    serializer_class = EntrySerializer
    filter_fields = ('author', 'status')

参考:

Django笔记 Django REST Framework实现Web API 1
https://blog.csdn.net/SVALBARDKSY/article/details/50548073

RESTful API 设计指南
http://www.ruanyifeng.com/blog/2014/05/restful_api.html

理解RESTful架构
http://www.ruanyifeng.com/blog/2011/09/restful.html

你可能感兴趣的:(python)