2019做網(wǎng)站賺錢么中國(guó)電信視頻app下載
目錄
- 配置環(huán)境
- 創(chuàng)建 Django 項(xiàng)目和 APP
- 項(xiàng)目組成 ?
- 子目錄文件組成
- 應(yīng)用文件組成
- 配置 settings.py
- 啟動(dòng)項(xiàng)目
- 數(shù)據(jù)表創(chuàng)建
- models.py
- Django-models的常用字段和常用配置
- Django-admin 引入admin后臺(tái)和管理員
- 外鍵
- views.py
- urls.py
- postman接口測(cè)試
- QuerySet
- Instance功能
- APIView 的概念
- views.py
- url.py
- 序列化器serializers
- serializer.py
- 測(cè)試
- Django-DRF 路由組件
- Django-DRF 自定義函數(shù)
- 參考
配置環(huán)境
創(chuàng)建虛擬環(huán)境
conda create -n erp-env python=3.9
激活虛擬環(huán)境
conda activate erp-env
requirements.txt文件
decorator==5.1.1
Django==4.2.3
django-debug-toolbar==4.1.0
django-extensions==3.2.3
django-filter==23.2
django-rest-framework==0.1.0
djangorestframework==3.14.0
drf-spectacular==0.26.3
- Django 是一個(gè) Python web 框架,提供許多功能,如 ORM、認(rèn)證、表單、模板等,它可以幫助你更快、更輕松地開(kāi)發(fā) web 應(yīng)用程序。
- DRF(django-rest-framework) 是一個(gè)基于 Django 的強(qiáng)大而靈活的 RESTful 框架,它提供了許多工具和庫(kù),可幫助你快速開(kāi)發(fā)基于 RESTful API 的 web 應(yīng)用程序。
- Django-Filter 是一個(gè)基于 Django 的庫(kù),它提供了一種簡(jiǎn)單、靈活的方式來(lái)過(guò)濾 Django 模型的查詢集。Django-Filter 的 API 允許開(kāi)發(fā)者使用簡(jiǎn)單的查詢表達(dá)式,構(gòu)建和應(yīng)用復(fù)雜的過(guò)濾器,從而在查詢集中選擇和排除數(shù)據(jù)。
- DRF Spectacular 是 DRF 的 OpenAPI 規(guī)范工具。它可以自動(dòng)構(gòu)建和生成 OpenAPI 規(guī)范文檔,并提供方便的 API 測(cè)試工具,使你能夠更加輕松地創(chuàng)建、測(cè)試和維護(hù) RESTful API。同時(shí),它也支持集成 Django Filter,允許你通過(guò) URL 參數(shù)過(guò)濾查詢數(shù)據(jù)。
進(jìn)入requirements.txt文件所在目錄
cd C:\Users\gxx\Desktop\djangolearning
安裝python庫(kù)
pip install -r requirements.txt
或者
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
創(chuàng)建 Django 項(xiàng)目和 APP
創(chuàng)建項(xiàng)目文件夾
django-admin startproject erp
(1)
進(jìn)入manage.py所在路徑
cd C:\Users\gxx\Desktop\djangolearning\erp
創(chuàng)建 APP
python manage.py startapp test1
(2)
或者
進(jìn)入指定路徑
cd C:\Users\gxx\Desktop\djangolearning\erp\apps
創(chuàng)建 APP
django-admin startapp test2
項(xiàng)目組成 ?
- 項(xiàng)目名文件夾
- 子目錄下同名子文件夾
- manage.py文件
manage.py提供了一種命令行工具,允許你以多種方式與該Django項(xiàng)目進(jìn)行交互。如:python manage.py help,能列出它所能做的事情。注意,此文件一般情況下不需要改動(dòng)。 - 應(yīng)用文件夾
子目錄文件組成
- _init_.py: 是一個(gè)空文件,作用是所在的這個(gè)目錄可以被當(dāng)作包使用。
- settings.py:該Django項(xiàng)目整體配置文件。(該文件非常重要,建議認(rèn)真理解這個(gè)文件中可用的設(shè)置類型及其默認(rèn)值。)
- urls.py:Django項(xiàng)目的URL設(shè)置??梢暺錇槟愕膁jango網(wǎng)站的目錄。
- asgi.py與wsgi.py:常見(jiàn)的網(wǎng)關(guān)接口協(xié)議:CGI,FastCGI,WSGI,ASGI。asgi.py是異步服務(wù)器網(wǎng)關(guān)接口項(xiàng)目配置文件。ASGI描述了Python Web應(yīng)用程序和Web服務(wù)器之間的通用接口。與WSGI不同的是,ASGI允許每個(gè)應(yīng)用程序有多個(gè)異步事件。另外,ASGI支持同步和異步應(yīng)用程序。開(kāi)發(fā)人員可以將原有的同步WSGI Web應(yīng)用程序遷移到ASGI,也可以使用ASGI構(gòu)建新的異步Web應(yīng)用程序。
應(yīng)用文件組成
-
_init_.py 是一個(gè)空文件,作用同前。
-
admin.py 文件跟網(wǎng)站的后臺(tái)管理相關(guān)。
-
models.py 文件跟數(shù)據(jù)庫(kù)操作相關(guān)。主要用一個(gè) Python 類來(lái)描述數(shù)據(jù)表。運(yùn)用這個(gè)類,你可以通過(guò)簡(jiǎn)單的 Python 的代碼來(lái)創(chuàng)建、檢索、更新、刪除 數(shù)據(jù)庫(kù)中的記錄而無(wú)需寫一條又一條的SQL語(yǔ)句。
-
views.py 包含了頁(yè)面的業(yè)務(wù)邏輯,接收瀏覽器請(qǐng)求,進(jìn)行處理,返回頁(yè)面操作相關(guān)。
-
tests.py 文件用于開(kāi)發(fā)測(cè)試用例,在實(shí)際開(kāi)發(fā)中會(huì)有專門的測(cè)試人員使用。
-
apps.py 文件夾是django1.10之后增加的,通常里面包含對(duì)應(yīng)用的配置。
-
migrations:django 1.8之后推出的migrations機(jī)制使django數(shù)據(jù)模式管理更容易。migrations機(jī)制有兩個(gè)指令,makemigrations和migrate。makemigrations指令是用models里面的model和當(dāng)前的migrations代碼里面的model做對(duì)比,如果有新的修改,就生成新migrations代碼。migrate指令是用migrations目錄中代碼文件和django數(shù)據(jù)庫(kù)django_migrations表中的代碼文件做對(duì)比,如果表中沒(méi)有,那就對(duì)沒(méi)有的文件按順序及依賴關(guān)系做migrate apply,然后再把代碼文件名加進(jìn)migrations表中。
-
migrations文件夾 里面自動(dòng)生成了_init_.py文件
配置 settings.py
加入安裝的庫(kù)和新增的APP
'test1','rest_framework','django_filters','drf_spectacular',
啟動(dòng)項(xiàng)目
啟動(dòng)Django服務(wù)
python manage.py runserver
點(diǎn)擊http://127.0.0.1:8000
數(shù)據(jù)表創(chuàng)建
模塊功能
如前所述,models.py文件主要用一個(gè) Python 類來(lái)描述數(shù)據(jù)表。運(yùn)用這個(gè)類,可以通過(guò)簡(jiǎn)單的 Python 代碼來(lái)創(chuàng)建、檢索、更新、刪除
數(shù)據(jù)庫(kù)中的記錄而無(wú)需寫一條又一條的SQL語(yǔ)句。在model.py中創(chuàng)建兩個(gè)表:產(chǎn)品分類表和產(chǎn)品信息表。
models.py
產(chǎn)品分類表和產(chǎn)品信息表
from django.db.models import *# Create your models here.
## 產(chǎn)品分類表
class GoodsCategory(Model):"""產(chǎn)品分類"""name = CharField(max_length=64, verbose_name='分類名稱')remark = CharField(max_length=64, null=True, verbose_name='備注', blank=True)## 產(chǎn)品表
class Goods(Model):"""產(chǎn)品"""# 外鍵category = ForeignKey(GoodsCategory, on_delete=SET_NULL, related_name='goods_set', null=True, verbose_name='產(chǎn)品分類',blank=True, )# on_deletenumber = CharField(max_length=32, verbose_name='產(chǎn)品編號(hào)')name = CharField(max_length=64, verbose_name='產(chǎn)品名稱')barcode = CharField(max_length=32, null=True, blank=True, verbose_name='條碼')spec = CharField(max_length=64, null=True, blank=True, verbose_name='規(guī)格')shelf_life_days = IntegerField(null=True, verbose_name='保質(zhì)期天數(shù)')purchase_price = FloatField(default=0, verbose_name='采購(gòu)價(jià)')retail_price = FloatField(default=0, verbose_name='零售價(jià)')remark = CharField(max_length=128, null=True, blank=True, verbose_name='備注')
合并數(shù)據(jù)庫(kù)
這兩個(gè)命令是Django框架中的關(guān)鍵命令,用于進(jìn)行數(shù)據(jù)庫(kù)遷移。當(dāng)你修改了Django模型后,你需要運(yùn)行這兩個(gè)命令,以將這些更改應(yīng)用到數(shù)據(jù)庫(kù)中。
python manage.py makemigrations
這個(gè)命令用于生成遷移腳本。當(dāng)你更新了模型文件之后,需要運(yùn)行該命令,Django會(huì)檢測(cè)模型的改變,然后自動(dòng)生成相應(yīng)的遷移腳本,存儲(chǔ)在 migrations/
目錄下。通常來(lái)說(shuō),你需要針對(duì)每個(gè)應(yīng)用運(yùn)行一次該命令。
python manage.py migrate
這個(gè)命令用于將遷移腳本應(yīng)用到數(shù)據(jù)庫(kù)中。當(dāng)你在模型文件中進(jìn)行更改之后,需要先通過(guò) makemigrations
命令生成遷移腳本,然后運(yùn)行該命令將這些腳本應(yīng)用到數(shù)據(jù)庫(kù)中。對(duì)于新的遷移腳本,Django會(huì)逐個(gè)執(zhí)行它們,從而更新數(shù)據(jù)庫(kù)結(jié)構(gòu)。對(duì)于已經(jīng)執(zhí)行過(guò)的腳本,Django會(huì)跳過(guò)它們,避免重復(fù)執(zhí)行。
這兩個(gè)命令是Django框架中非常重要的命令,在修改數(shù)據(jù)庫(kù)相關(guān)內(nèi)容時(shí)必須時(shí)刻清醒地記住使用它們。
在終端運(yùn)行命令
Django-models的常用字段和常用配置
常用字段
CharField
用于存儲(chǔ)字符串類型,有最大長(zhǎng)度限制
IntegerField
用于存儲(chǔ)整數(shù)類型
FloatField
用于存儲(chǔ)浮點(diǎn)數(shù)類型
BooleanField
用于存儲(chǔ)布爾類型
DateField
用于存儲(chǔ)日期類型
DateTimeField
用于存儲(chǔ)日期和時(shí)間類型
ImageField
用于存儲(chǔ)圖片類型
FileField
用于存儲(chǔ)文件類型
ForeignKey
外鍵 用于表示數(shù)據(jù)庫(kù)表之間的關(guān)聯(lián)關(guān)系
OneToOneField
一對(duì)一 用于表示一對(duì)一的關(guān)聯(lián)關(guān)系
ManyToManyField
多對(duì)多 用于表示多對(duì)多的關(guān)聯(lián)關(guān)系
?
常用配置
max_length
字段的最大長(zhǎng)度限制,可以應(yīng)用于多種不同的字段類型。
verbose_name
字段的友好名稱,便于在管理員后臺(tái)可視化操作時(shí)使用。
default
指定字段的默認(rèn)值。
null
指定字段是否可以為空。
null=True
設(shè)置允許該字段為 NULL 值
blank
指定在表單中輸入時(shí)是否可以為空白。
choices
用于指定字段的可選值枚舉列表,在最上面定義
字段定義
class DeliveryMaterial(Model):class Status(TextChoices):QUALIFIED = ('qualified', '良品')
UNQUALIFIED = ('unqualified', '不良品')status = CharField(max_length=32, choices=Status.choices, default=Status.QUALIFIED, verbose_name='狀態(tài)')
TextChoices
是 Django 3.0 引入的一個(gè)枚舉類,用于在模型字段中創(chuàng)建可選擇的、文本值的選項(xiàng)。
related_name
指定在多對(duì)多等關(guān)系中反向使用的名稱。
on_delete
指定如果外鍵關(guān)聯(lián)的對(duì)象被刪除時(shí)應(yīng)該采取什么操作。
Django-admin 引入admin后臺(tái)和管理員
創(chuàng)建后臺(tái) admin 管理員
在終端運(yùn)行命令
python manage.py createsuperuser
python manage.py runserver
打開(kāi)網(wǎng)址 http://127.0.0.1:8000/admin
?
配置
在admin.py文件中注冊(cè)你的模型:
from django.contrib import admin
from .models import *
# Register your models here.admin.site.register(Goods)
admin.site.register(GoodsCategory)
外鍵
models.py
category = ForeignKey(GoodsCategory,on_delete=SET_NULL,related_name='goods_set',null=True,verbose_name='產(chǎn)品分類')
on_delete
設(shè)置當(dāng)外鍵對(duì)應(yīng)的數(shù)據(jù)被刪除時(shí)的反應(yīng)
null=True
概念
外鍵是一種用于建立表之間關(guān)聯(lián)關(guān)系的約束,通常指的是一個(gè)模型中的一個(gè)或多個(gè)字段的值必須符合另一個(gè)模型中對(duì)應(yīng)字段的值。
views.py
# Create your views here.
from django.shortcuts import render
from rest_framework.response import Response
from .models import *
from rest_framework.decorators import api_view
from django.shortcuts import get_object_or_404# Create your views here.
# GET
# POST# 函數(shù)式編程
@api_view(['POST', 'GET'])
def InsertGoodsCategory(request):category_name = request.data.get('分類名字')# 獲取分類對(duì)象或創(chuàng)建新的分類對(duì)象category, created = GoodsCategory.objects.get_or_create(name=category_name)# 判斷是否已存在分類if not created:return Response({"status": "已存在", "goods_category": category_name}, status=200)else:return Response({"message": f"Successfully inserted category '{category_name}'."})@api_view(['POST', 'GET'])
def FilterGoodsCategory(request):data = request.data.get('分類名字')goods = GoodsCategory.objects.filter(name=data)if goods.exists():return Response({"status": "已存在", "goods_category": data}, status=200)else:return Response({"status": "不存在", "goods_category": data}, status=404)
urls.py
- 放入路由
import os
import sys
os.chdir(os.path.dirname(__file__))
sys.path.append("..")
from django.contrib import admin
from django.urls import path
from test1.views import *
from django.urls import include
from rest_framework import routersurlpatterns = [path('admin/', admin.site.urls),path('filtergoodscategory/', FilterGoodsCategory),path('insertgoodscategory/', InsertGoodsCategory),# path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),# path('getgoods/', GetGoods.as_view()),
]
運(yùn)行項(xiàng)目
python manage.py runserver
postman接口測(cè)試
- 使用postman針對(duì)
insertGoodsCategory/
和filtergoodscategory/
API接口進(jìn)行測(cè)試,測(cè)試結(jié)果如下
http://127.0.0.1:8000/insertgoodscategory/
http://127.0.0.1:8000/filtergoodscategory/
QuerySet
從數(shù)據(jù)庫(kù)中查詢結(jié)果存放的集合稱為 QuerySet。 Django ORM用到三個(gè)類:Manager、QuerySet、Model。每個(gè)Model都有一個(gè)默認(rèn)的
manager實(shí)例,名為objects。Django的ORM通過(guò)Model的objects屬性提供各種數(shù)據(jù)操作的接口(API),并通過(guò) Model.objects 方法返回QuerySet,生產(chǎn)符合查詢條件的列表,列表中包含多個(gè) Instance。
class QuerySet(model=None, query=None, using=None)[source]
其具有兩大特色
(1) 惰性:若這個(gè)對(duì)象中包含了需要的數(shù)據(jù)且需要使用時(shí),它會(huì)去DB中獲取數(shù)據(jù),否則不會(huì)獲取。 比如說(shuō)在內(nèi)部,創(chuàng)建、過(guò)濾、切片和傳遞一個(gè)QuerySet,而沒(méi)有進(jìn)行真正的數(shù)據(jù)執(zhí)行,不會(huì)真實(shí)操作數(shù)據(jù)庫(kù),被稱為惰性。
(2)緩存使用同一個(gè)查詢集,第一次使用時(shí)會(huì)發(fā)生數(shù)據(jù)庫(kù)的查詢,然后Django會(huì)把結(jié)果緩存下來(lái),再次使用這個(gè)查詢集時(shí)會(huì)使用緩存的數(shù)據(jù),減少了數(shù)據(jù)庫(kù)的查詢次數(shù)。
操作說(shuō)明
設(shè)定:已存在數(shù)據(jù)表定義如下:
class Goods(DjangoPeople):
{
number = CharField(max_length=32, verbose_name=‘編號(hào)’)
name = CharField(max_length=64, verbose_name=‘名稱’)
unit = CharField(max_length=64, verbose_name=‘單位’)
remark = CharField(max_length=256, verbose_name=‘備注’)
}
all()
:返回模型的所有對(duì)象,它的效果等價(jià)于不帶任何條件的 filter()
方法。
如:
DjangoPeople.objects.all() # 查詢所有 語(yǔ)句。
filter()(**kwargs)
用于返回符合條件的所有數(shù)據(jù)。
如:
DjangoPeople.objects.filter(name=“abc”) #取出name="abc"的DjangoPeople成員
又如:
DjangoPeople.objects.filter(name=“x”).filter(unit=“y”) #取出name="x"且unit="y"的DjangoPeople成員
get()
方法與 filter()
的作用類似,用于返回符合條件的單個(gè)對(duì)象但是可能會(huì)返回多個(gè)值
delete()
:可以刪除符合條件的所有對(duì)象
如:
catagories_to_delete=DjangoPeople.objects.filter(name=“abc”)
deleted_count= categories_to_delete.delete()
update()
:將符合條件的所有對(duì)象的某個(gè)字段值進(jìn)行更新
create()
是 save()
方法的快捷方式,用于創(chuàng)建并保存一個(gè)新的對(duì)象。
如:
created_category = DjangoPeople.objects.create(name="abc")
count()
:返回符合條件的對(duì)象數(shù)量
order_by()
:對(duì)返回的對(duì)象進(jìn)行排序,默認(rèn)為升序。降序則在字段名前面加負(fù)號(hào)。
QuerySet其他的其接口定義,用法類似,這里不再一一贅述,需要運(yùn)用,可查閱Django官網(wǎng)。
Instance功能
Instance指的是一個(gè) Django 模型的單個(gè)實(shí)例,也就是數(shù)據(jù)庫(kù)中的一行數(shù)據(jù)。相比于 QuerySet(查詢集合),它是針對(duì)單個(gè)對(duì)象的操作,用于創(chuàng)建、更新或者刪除單個(gè)模型實(shí)例。
創(chuàng)建一個(gè)對(duì)象:
Obj = Model(attr1=val1, attr2=val2),Obj.save()
更新一個(gè)對(duì)象:
Obj = Model.objects.get(id=xxx),Obj.attr1 = val1,Obj.save()
刪除一個(gè)對(duì)象:
Obj = Model.objects.get(id=xxx),Obj.delete()
QuerySet 適用于需要查找多個(gè)對(duì)象或進(jìn)行聚合操作的場(chǎng)景,而 Instance 適用于單獨(dú)對(duì)象的創(chuàng)建、修改和刪除操作。
APIView 的概念
APIview 是 Django REST Framework 提供的一個(gè)視圖類。它和 Django 中的 view 類有些相似,但是又有一些不同之處。APIview 可以處理基于 HTTP 協(xié)議的請(qǐng)求,并返回基于內(nèi)容協(xié)商的響應(yīng),它旨在提供一個(gè)易于使用且靈活的方式來(lái)構(gòu)建 API 視圖。
views.py
首先,self 表示當(dāng)前實(shí)例對(duì)象,這里指的是視圖類的實(shí)例對(duì)象。
request 表示當(dāng)前的請(qǐng)求對(duì)象,包含了客戶端發(fā)送的信息,例如請(qǐng)求頭、請(qǐng)求體等。
pk 是 path 參數(shù) int:pk,用于獲取請(qǐng)求中的產(chǎn)品 ID。
format 表示客戶端請(qǐng)求的響應(yīng)格式,例如 JSON、XML 等。這個(gè)參數(shù)通常不需要指定,會(huì)根據(jù)客戶端發(fā)送的 Accept 請(qǐng)求頭來(lái)自動(dòng)選擇響應(yīng)格式。如果客戶端指定了響應(yīng)格式,那么我們可以從請(qǐng)求中獲取到這個(gè)參數(shù)并且做出相應(yīng)的處理。
在這個(gè)方法中,我們需要通過(guò) pk 參數(shù)獲取到對(duì)應(yīng)的產(chǎn)品數(shù)據(jù),并將其序列化成 JSON 格式并返回給客戶端。具體的實(shí)現(xiàn)方式可以參考序列化器文檔和 Django ORM 文檔。
from django.shortcuts import render
from rest_framework.response import Response
from .models import *
from rest_framework.decorators import api_view
from django.shortcuts import get_object_or_404
from rest_framework.views import APIView
from .serializer import *
from rest_framework.decorators import actionfrom django.db.models import Q
from rest_framework.viewsets import ModelViewSet#### modelviewset
class GoodsCategoryViewSet(ModelViewSet):# 指定查詢集(用到的數(shù)據(jù))queryset = GoodsCategory.objects.all()# 指定查詢集用到的序列化容器serializer_class = GoodsCategorySerilizer@action(detail=False, methods=['get'])def latest(self, request):latest_obj = GoodsCategory.objects.latest('id')print(latest_obj)return Response("helllo 你調(diào)用了自定義的函數(shù)")@action(detail=False, methods=['get', 'post'])def delete_example(self, request):name = request.data.get('name')# 刪除名稱為 'name' 的商品categories_to_delete = GoodsCategory.objects.filter(name=name)# 使用delete()方法刪除對(duì)象deleted_count = categories_to_delete.delete()print(f"Deleted {deleted_count} categories.")@action(detail=False, methods=['get', 'post'])def create_example(self, request):name = request.data.get('name')# 使用create()方法創(chuàng)建新的商品分類對(duì)象created_category = GoodsCategory.objects.create(name)print("Created category:", created_category)# Create your views here.# GET
# POST#### 函數(shù)式編程
@api_view(['POST', 'GET'])
def FilterGoodsCategory(request):if request.method == 'GET':print(request.method)if request.method == 'POST':print(request.method)data = request.data.get('分類名字')goods_category = get_object_or_404(GoodsCategory, name=data)print(goods_category)# ans = Goods.objects.filter(category=goods_category).all().values()# print(ans)goods = Goods.objects.filter(category=goods_category)serializer = GoodsSerializer(goods, many=True) # 請(qǐng)確保導(dǎo)入合適的序列化器# 輸出對(duì)象 和 數(shù)據(jù)類型print("object type:", type(Goods.objects))print("object.all() type:", type(Goods.objects.all()))print("object.all().values type:", type(Goods.objects.all().values()))# Instanceprint("object.get(id=1) type:", type(Goods.objects.get(id=1)))return Response(serializer.data)# return Response(ans)@api_view(['POST', 'GET'])
def InsertGoodsCategory(request):category_name = request.data.get('分類名字')# 獲取分類對(duì)象或創(chuàng)建新的分類對(duì)象category, created = GoodsCategory.objects.get_or_create(name=category_name)# 判斷是否已存在分類if not created:return Response({"status": "已存在", "goods_category": category_name}, status=200)else:return Response({"message": f"Successfully inserted category '{category_name}'."})@api_view(['POST', 'GET'])
def FilterGoodsCategory(request):data = request.data.get('分類名字')goods = GoodsCategory.objects.filter(name=data)if goods.exists():return Response({"status": "已存在", "goods_category": data}, status=200)else:return Response({"status": "不存在", "goods_category": data}, status=404)#### APIView
class GetGoods(APIView):def get(self, request):data = Goods.objects.all()serializer = GoodsSerializer(instance=data, many=True)print(serializer.data)return Response(serializer.data)def post(self, request):# 從請(qǐng)求數(shù)據(jù)中提取字段request_data = {"category": request.data.get("Goodscategory"),"number": request.data.get("number"),"name": request.data.get("name"),"barcode": request.data.get("barcode"),"spec": request.data.get("spec"),"shelf_life_days": request.data.get("shelf_life_days"),"purchase_price": request.data.get("purchase_price"),"retail_price": request.data.get("retail_price"),"remark": request.data.get("remark"),}# 使用 create() 方法創(chuàng)建新的商品對(duì)象new_goods = Goods.objects.create(**request_data)# 對(duì)創(chuàng)建的對(duì)象進(jìn)行序列化,并作為響應(yīng)返回serializer = GoodsSerializer(instance=new_goods)return Response(serializer.data)# 面向?qū)ο缶幊?/span>
class FilterGoodsCategoryAPI(APIView):# request 表示當(dāng)前的請(qǐng)求對(duì)象# self 表示當(dāng)前實(shí)例對(duì)象def get(self, request, format=None):print(request.method)return Response('ok')def post(self, request, format=None):print(request.method)return Response('ok')def put(self, request, format=None):print(request.method)return Response('ok')
url.py
import os
import sys
os.chdir(os.path.dirname(__file__))
sys.path.append("..")from django.contrib import admin
from django.urls import pathfrom test1.views import *
from django.urls import include
from rest_framework import routers# 創(chuàng)建DefaultRouter對(duì)象,用于生成路由
router = routers.DefaultRouter()
# 將視圖集注冊(cè)到路由器上,字符串里的是URL路徑的前綴
router.register('GoodsCategory', GoodsCategoryViewSet)urlpatterns = [path('admin/', admin.site.urls),path('filtergoodscategory/', FilterGoodsCategory),path('insertgoodscategory/', InsertGoodsCategory),path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),path('getgoods/', GetGoods.as_view()),
]
# 把生成的url 添加到項(xiàng)目的url配置中
urlpatterns += router.urls
序列化器serializers
序列化器的作用
序列化將 queryset
和 instance
轉(zhuǎn)換為 json/xml/yaml
返回給前端
反序列化與序列化則相反
定義序列化器
定義類,繼承自 Serializer
通常新建一個(gè) serializers.py
文件 撰寫序列化內(nèi)容
suah as
目前只支持
read_only
只讀
label
字段說(shuō)明信息
max_length
最大長(zhǎng)度
serializer.py
在應(yīng)用文件夾(test1)下新建serializer.py文件
from rest_framework.serializers import *
from .models import *class GoodsCategorySerilizer(ModelSerializer):class Meta:model = GoodsCategoryfields = '__all__'# 構(gòu)建產(chǎn)品序列化器
class GoodsSerializer(ModelSerializer):# 外鍵字段相關(guān)的數(shù)據(jù) 需要單獨(dú)寫category = GoodsCategorySerilizer()class Meta:# 指定需要序列化的表model = Goods# 指定我們需要序列化的字段fields = '__all__'
a. 序列化單個(gè)對(duì)象
-
獲取對(duì)象
data = Goods.objects.get(id=1)
-
創(chuàng)建序列化器
sberializer = GoodsSerializer(instance=data)
-
轉(zhuǎn)換數(shù)據(jù)
print(serializer.data)
-
注意點(diǎn):
instance
是一個(gè)參數(shù),用于指定要序列化或反序列化的 Python 對(duì)象。具體來(lái)說(shuō),它是一個(gè)類實(shí)例(Class Instance),通常是指一個(gè)從數(shù)據(jù)庫(kù)或其他數(shù)據(jù)源中檢索出來(lái)的模型實(shí)例(Model Instance)。當(dāng)我們需要將一個(gè)模型實(shí)例轉(zhuǎn)換為 JSON 或其他格式時(shí),可以使用 Django 的序列化器(Serializer)來(lái)實(shí)現(xiàn)。
-
輸出:
{'id': 1, 'number': '1', 'name': '第一個(gè)產(chǎn)品', 'purchase_price': 100.0, 'retail_price': 150.0, 'remark': '測(cè)試產(chǎn)品'}
b. 序列化多個(gè)對(duì)象
data = Goods.objects.all() # 獲取對(duì)象# 創(chuàng)建序列化器,many表示序列化多個(gè)對(duì)象,默認(rèn)為單個(gè)serializer = GoodsSerializer(instance=data,many=True)print(serializer.data) # 轉(zhuǎn)換數(shù)據(jù)# 輸出:[OrderedDict([('id', 1), ('number', '1'), ('name', '第一個(gè)產(chǎn)品'), ('purchase_price', 100.0), ('retail_price', 150.0), ('remark', '測(cè)試產(chǎn)品')]), OrderedDict([('id', 2), ('number', '123'), ('name', '產(chǎn)品2'), ('purchase_price', 123.0), ('retail_price', 4123.0), ('remark', '測(cè)試產(chǎn)品2')])]
測(cè)試
python manage.py runserver
打開(kāi)網(wǎng)頁(yè)http://127.0.0.1:8000/admin/
http://127.0.0.1:8000/getgoods/
Django-DRF 路由組件
DefaultRouter
是Django REST framework中提供的一個(gè)路由器類,用于自動(dòng)生成URL路由。
路由器是將URL與視圖函數(shù)或視圖集關(guān)聯(lián)起來(lái)的一種機(jī)制。Django REST framework的路由器通過(guò)簡(jiǎn)單的配置可以自動(dòng)生成標(biāo)準(zhǔn)的URL路由,從而減少了手動(dòng)編寫URL路由的工作量。
DefaultRouter的使用方法
urls.py
使用 routers.DefaultRouter()
創(chuàng)建了一個(gè)默認(rèn)的路由器對(duì)象,并使用 router.register()
方法注冊(cè)了一個(gè)視圖集,GoodsCategoryViewSet
。這樣可以自動(dòng)為這個(gè)視圖集生成對(duì)應(yīng)的URL路由,并將其添加到 urlpatterns
中。
http://127.0.0.1:8000/GoodsCategory/
Django-DRF 自定義函數(shù)
自定義函數(shù)是什么?
from rest_framework.decorators import action
@action
是 Django REST framework 中的一個(gè)裝飾器,用于將自定義函數(shù)轉(zhuǎn)換為視圖集的一個(gè)動(dòng)作。@action
裝飾器提供了一種定義自定義函數(shù)的方式,這些函數(shù)并不直接對(duì)應(yīng)于標(biāo)準(zhǔn)的 CRUD 操作(Create-Read-Update-Delete),而是實(shí)現(xiàn)一些其他的自定義行為或業(yè)務(wù)邏輯。
“@action 裝飾器”用于在 ViewSet 中創(chuàng)建自定義動(dòng)作(custom action),為 ViewSet 提供了更靈活應(yīng)用且 @action
只在ViewSet視圖集中生效。視圖集中附加action裝飾器可接收兩個(gè)參數(shù):
(1)methods: 聲明該action對(duì)應(yīng)的請(qǐng)求方式.
(2)detail: True/False聲明該action的路徑是否是action對(duì)應(yīng)的請(qǐng)求方式。
其中,detail=False
表示該動(dòng)作不需要處理單個(gè)對(duì)象,而是處理整個(gè)集合;
被 @action
裝飾的函數(shù)需要作為方法定義在視圖集類中,并且在使用 router.register()
注冊(cè)視圖集時(shí),需要指定 basename
參數(shù),以確保該動(dòng)作的 URL 能夠正確映射到視圖集。
參考
https://github.com/Joe-2002/sweettalk-django4.2#readme