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
在这里插入图片描述

定义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
在这里插入图片描述

启动服务器:

python manage.py runserver 192.168.99.218:8080

http://192.168.99.218:8080/
http://192.168.99.218:8080/admin/
在这里插入图片描述

添加 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

效果:
在这里插入图片描述

使用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/
在这里插入图片描述
http://192.168.99.218:8080/api/users/

在这里插入图片描述

实验

http://192.168.99.218:8080/admin/
添加Users
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
执行如下的连接:
http://192.168.99.218:8080/api/users/

在这里插入图片描述

在以上图片的post处,添加Name 和Mail
然后点击POST
在这里插入图片描述
在这里插入图片描述
再次 执行 如下连接:
http://192.168.99.218:8080/api/users/

在这里插入图片描述

测试 Entry

在这里插入图片描述

在这里插入图片描述

修改一下文件:
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')

在这里插入图片描述

分页:

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/

在这里插入图片描述

筛选 — 没有成功

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值