ModelViewSet 視圖集 實現接口


 

一.創建項目

1.創建 項目 : 

django-admin  startprojet  drf 

2. 創建 兩個app   ------ app1 ,book

python manage.py  startapp  app1

python manage.py  startapp  book

3. settings 配置  ,一定不能少了 rest_framework 這個app的注冊。

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'book',
  'app1',
]
# 連接數據庫

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'book', # 數據庫名
        'HOST':'127.0.0.1',
        'PORT':3306,
        'USER':'root',
        'PASSWORD':'123'  # 這里必須為字符串
    }
}

4. 主應用中 __init__.py 文件中:

import pymysql

pymysql.install_as_MySQLdb()

5.  bookapp 中的  model.py 中建表

from django.db import models

# Create your models here.

class Book(models.Model):

    title = models.CharField(max_length=32,verbose_name='書名')

    pub_date = models.DateField(verbose_name='出版日期')

    bread = models.IntegerField(verbose_name='閱讀量')

    bcomment = models.IntegerField(verbose_name='評論數')

    class Meta:

        db_table ='book'

    def __str__(self):

        return self.title


class Hero(models.Model):

    name = models.CharField(max_length=32,verbose_name='名字')

    age = models.IntegerField(verbose_name='年齡')


    class Meta:

        db_table='人物'


    def __str__(self):

        return self.name

6. 數據庫遷移。

python manage.py  makemigrations

python manage.py  migrate

7. 在表中錄入數據。

 

接口實現

 

1.在app1 先創建serializers.py 文件

from rest_framework import serializers

from book.models import Book,Hero


class BookModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Book

        fields='__all__'

        # 可以給模型序列化器里面指定的字段設置限制選項
        extra_kwargs = {
            'bread':{'min_value':0,'required':True}
        }

class HeroModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = Hero

        fields = '__all__'

2. app1  views.py  創建視圖

from django.shortcuts import render

# Create your views here.
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from app1.serializers import BookModelSerializer, HeroModelSerializer
from book.models import Book, Hero


class BookModelViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookModelSerializer

    @action(methods=['get'],detail=False)#detail=False 是否為詳情頁數據
    def get_top_5(self,request):  # 其接口 http://127.0.0.1:8000/app1/book/get_top_5/
        # 獲取閱讀量最多的5條數據
        books = Book.objects.order_by('-bread')[:5] # 取閱讀量為前5的書籍

        serializer = BookModelSerializer(instance=books,many=True)

        return Response(serializer.data)

    # action是drf提供的路由和視圖方法綁定關系的裝飾器
    # from rest_framework.decorators import action
    # 參數1: methods 列表,設置視圖方法允許哪些http請求訪問進來
    # 參數2: detail  當前是否方法是否屬於詳情頁視圖,
    #        False,系統不會自動增加pk在生成的路由地址中
    #        True  則系統會自動增加pk在生成的路由地址
    @action(methods=['get','post'],detail=True)
    def get_one_title(self,request,pk):

        book = Book.objects.get(pk=pk)

        return Response(book.btitle)

class HeroModelViewSet(ModelViewSet):

    queryset = Hero.objects.all()

    serializer_class = HeroModelSerializer

3. 配置路由

  1.app1 應用下創建一個路由文件  urls.py

from rest_framework import routers from app1.views import BookModelViewSet, HeroModelViewSet

urlpatterns=[]

router = routers.DefaultRouter() # 開發環境用,有主界面
# router = routers.SimpleRouter() # 生產環境用
 router.register('book',BookModelViewSet) router.register('hero',HeroModelViewSet) urlpatterns += router.urls

  2.主應用下 urls.py 文件中

from django.contrib import admin
from django.urls import path,include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('app1/',include('app1.urls')) ]

 

經過上面的創建完成了 book表和hero 表的增刪改查功能的API接口的實現。

 

DefaultRouter()的區別 SimpleRouter()

DefaultRouter() 可以多返回一個主頁面,而 simleRouter 沒有以下的頁面。
 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM