python 之 Django框架(orm單表查詢、orm多表查詢、聚合查詢、分組查詢、F查詢、 Q查詢、事務、Django ORM執行原生SQL)

来源:https://www.cnblogs.com/mylu/archive/2019/08/29/11432307.html
-Advertisement-
Play Games

ForeignKey操作:書籍表(Book表)外鍵關聯出版社表(Publisher表) 正向查找: 反向查找: ManyToManyField:(使用方式二:通過ManyToManyField自動創建第三張表) models: class RelatedManager:"關聯管理器"是在一對多或者多 ...


12.329 orm單表查詢
import os
if __name__ == '__main__':
    # 指定當前py腳本需要載入的Django項目配置信息
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings")
    import django
    django.setup()          # 啟動Django項目
    from app01 import models
    
#返回QuerySet對象的方法:
    ret = models.Book.objects.all()  
    print(ret)                      # QuerySet類型:書籍對象的列表
​
    ret = models.Book.objects.filter(title="圍城")  # QuerySet類型  --> 書籍對象的列表
    # id值大於1
    ret = models.Book.objects.filter(id__gt=1)  
    # id值小於3
    ret = models.Book.objects.filter(id__lt=3) 
    # 出版日期是2017年的書
    ret = models.Book.objects.filter(publisher_date__year=2017)  
    # 出版日期大於2017年
    ret = models.Book.objects.filter(publisher_date__year__gt=2017)  
    # 書名中包含'曌'的書
    ret = models.Book.objects.filter(title__contains="") 
    # 書名中包含'曌'的書並且出版年份是2018年
    ret = models.Book.objects.filter(title__contains="", publisher_date__year=2018)  
​
    # get方法如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
    #符合篩選條件的對象只有一個,則返回具體的類對象實例:書籍對象,而不是列表
    ret = models.Book.objects.get(id=10)  
    print(ret)                          #報錯
    # 使用filter檢索的時候沒有滿足條件的數據就返回一個空 QuerySet
    ret = models.Book.objects.filter(id=10)  
    print(ret)                          #[]
# 將滿足條件的去掉,留下不滿足條件的
    ret = models.Book.objects.exclude(id__in=[1,3,4])
    print(ret)
    # 按欄位排序
    ret = models.Book.objects.all().order_by("price")  # QuerySet類型:根據price欄位對所有數據排序
    ret = models.Book.objects.all().order_by("-price")  
    #反轉
    ret = models.Book.objects.all().order_by("price").reverse()  
    # 按照出版時間排序後反轉再去欄位值  # QuerySet類型:欄位及欄位值的字典的列表
    ret = models.Book.objects.all().order_by("publisher_date").reverse().values("title")  
      
#特殊的QuerySet:
    #values() 取欄位的值,以字典返回
    ret = models.Book.objects.filter(publisher_date__year=2018).values("title", "publisher_date") 
    print(ret)          # QuerySet類型:欄位及欄位值的字典的列表
    #values_list() 取欄位的值,以元組返回
    ret = models.Book.objects.filter(publisher_date__year=2018).values_list("title", "publisher_date")        # QuerySet類型:欄位值的元祖的列表
    # 連表查詢
    ret = models.Book.objects.all().values("publisher__name").distinct()  
    print(ret)           # QuerySet類型:欄位及欄位值的字典的列表,並去重
#返回數字的方法
    # count 計數
    ret = models.Book.objects.all().count()  # 數字:結果集中數據的個數   
#返回具體對象
    #first()和last()
    ret = models.Book.objects.all().first()  #結果集中的第一個對象
    #get()
    ret = models.Book.objects.get(id=1)      #返回匹配到的對象,有且僅有一個
#返回布爾值的方法
    # 判斷結果集中是否有數據
    ret = models.Book.objects.all().exists()  # 布爾值:結果集中是否有數據
12.3210 orm多表查詢(方式二)

ForeignKey操作:書籍表(Book表)外鍵關聯出版社表(Publisher表)

正向查找:

1.基於對象(子查詢)
book_obj = models.Book.objects.first()    # 第一本書對象
print(book_obj.publisher)                # 得到這本書關聯的出版社對象
print(book_obj.publisher.name)            # 得到出版社對象的名稱
2.基於雙下劃線欄位方法(聯表查詢)
print(models.Book.objects.values_list("publisher__name"))

反向查找:

1.基於對象(子查詢)
publisher_obj = models.Publisher.objects.first()   # 找到第一個出版社對象
books = publisher_obj.book_set.all()              # 找到第一個出版社出版的所有書籍對象
titles = books.values_list("title")               # 找到第一個出版社出版的所有書籍的書名
#如果設置了 related_name="books"
#publisher= models.ForeignKey(to="Publisher", related_name="books")
publisher_obj = models.Publisher.objects.first()
ret = publisher_obj.books.all()
print(ret)#<QuerySet [<Book: 西瓜物語>, <Book: 香蕉物語>]>
2.基於雙下劃線的欄位方法(聯表查詢)
ret = models.Publisher.objects.filter(id=1).values_list("book__title")
print(ret)#<QuerySet [('西瓜物語',), ('香蕉物語',)]>
titles = models.Publisher.objects.values_list("book__title")
print(titles)#<QuerySet [('西瓜物語',), ('香蕉物語',), ('番茄物語',), (None,)]>
#如果related_query_name="books"或者 related_name="books"(如果兩個同時出現,則以related_query_name為準)
titles = models.Publisher.objects.filter(id=1).values_list("books__title")
#<QuerySet [('西瓜物語',), ('香蕉物語',)]>
titles = models.Publisher.objects.filter(id=1).values("books__title")
#<QuerySet [{'books__title': '西瓜物語'}, {'books__title': '香蕉物語'}]>

ManyToManyField:(使用方式二:通過ManyToManyField自動創建第三張表)

models:

class Book(models.Model):
    title = models.CharField(max_length=32)
    publish_date = models.DateField(auto_now_add=True)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    memo = models.TextField(null=True)
    # 創建外鍵,關聯publish
    publisher = models.ForeignKey(to="Publisher", )
    # 創建多對多關聯author
    author = models.ManyToManyField(to="Author")
​
class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    phone = models.CharField(max_length=11)
    detail = models.OneToOneField(to="AuthorDetail")

class RelatedManager:"關聯管理器"是在一對多或者多對多的關聯上下文中使用的管理器。

它存在於下麵兩種情況:外鍵關係的反向查詢多對多關聯關係,簡單來說就是當 "."後面的對象 可能存在多個的時候就可以使用以下的方法

create():創建一個新的對象,保存對象,並將它添加到關聯對象集之中,返回新創建的對象。

#models.Book.objects.first().author得到是一個class RelatedManager對象,使用.create操作author表和第三張表
1.正向創建author表數據
ret = models.Book.objects.first().author.create(name="張三",age=16,phone="18012xxxx",detail_id=4) 
#做了兩件事情:1. 創建了一個新的作者,2. 將新創建的作者和第一本書做關聯
ret = models.Book.objects.first().author.all().values("id")
print(ret)#<QuerySet [{'id': 1}, {'id': 3}, {'id': 15}]>
2.反向創建book表數據
import datetime
models.Author.objects.first().book_set.create(title="番茄物語", publish_date=datetime.date.today())

add():把指定的model對象或對象id添加到關聯對象集中

#添加對象
author_objs = models.Author.objects.filter(id__lt=3)
models.Book.objects.first().author.add(*author_objs)
#添加id
models.Book.objects.first().author.add(*[1, 2])
models.Book.objects.first().author.add(1)
#第一本書關聯的作者id
ret = models.Book.objects.first().author.all().values("id")
print(ret)#<QuerySet [{'id': 1}, {'id': 3}, {'id': 15}]>

set():更新model對象的關聯對象。

ret=models.Book.objects.first().author.set([2, 3])#設置第三張表的關聯關係,給第一個book對象加上id=2和3
ret = models.Book.objects.first().author.all()
print(ret)#<QuerySet [<Author: 小仙女>, <Author: 大烏龜>, <Author: 張曌>]>
ret = models.Book.objects.first().author.all().values("id")
print(ret)#<QuerySet [{'id': 1}, {'id': 3}, {'id': 15}]>

remove():從關聯對象集中移除執行的model對象

models.Book.objects.first().author.remove(3)#找到第一個圖書對象所對應的所有作者,到第三張表中刪除它與id=3的作者的關聯關係#<QuerySet [{'id': 1}, {'id': 15},{'id'=3}]>
ret = models.Book.objects.first().author.all().values("id")
print(ret)        #<QuerySet [{'id': 1}, {'id': 15}]>

clear():從關聯對象集中移除一切對象。

#<QuerySet [{'id': 1}, {'id': 15}]>
models.Book.objects.first().author.clear()
ret = models.Book.objects.first().author.all().values("id")
print(ret)#<QuerySet []>

註意:對於ForeignKey對象,clear()和remove()方法僅在null=True時存在

all():

ret = models.Book.objects.first().author.all()#得到第一本書對象對應的作者對象集
print(ret)                                #<QuerySet [Author object,Author object,Author object]>
12.3211 聚合查詢

aggregate()是QuerySet 的一個終止子句,它返回一個包含一些鍵值對的字典。

鍵的名稱是聚合值的標識符,值是計算出來的聚合值。鍵的名稱是按照欄位和聚合函數的名稱自動生成出來的。

from django.db.models import Avg, Sum, Max, Min, Count
models.Book.objects.all().aggregate(Avg("price"))
#{'price__avg': 13.233333}
ret = models.Book.objects.aggregate(Sum("price"))
#{'price__sum': Decimal('13.10')
ret = models.Book.objects.aggregate(total_price=Sum("price"))
#{'total_price': Decimal('13.10')}
ret = models.Book.objects.aggregate(avg_price=Avg("price"), max_price=Max("price"), min_price=Min("price"))
#{'avg_price': 4.366667, 'max_price': Decimal('12.00'), 'min_price': Decimal('0.10')}
12.3212 分組查詢

單表查詢分組:按照部門分組求平均工資

select dept,AVG(salary) from employee group by dept;

orm查詢:

from django.db.models import Avg
models.Employee.objects.values("dept").annotate(avg=Avg("salary")                                   
#<QuerySet [{'dept': '教學部', 'avg': 221.0}, {'dept': '銷售部', 'avg': 21.0}, {'dept': '人事部', 'avg': 999.0}]>  
models.Employee.objects.values("dept").annotate(avg=Avg("salary").values('dept', "avg")
#<QuerySet [{'dept': '教學部', 'avg': 221.0}, {'dept': '銷售部', 'avg': 21.0}, {'dept': '人事部', 'avg': 999.0}]> 

連表查詢的分組:按照部門分組求平均工資

select dept.name,AVG(salary) from employee inner join dept on (employee.dept_id=dept.id) group by dept_id;

ORM查詢:

from django.db.models import Avg
models.Dept.objects.annotate(avg=Avg("employee__salary")).values("name", "avg")
​
models.Employee.objects.values("dept__name").annotate(avg=Avg("salary"))
#<QuerySet [{'dept__name': '垃圾部', 'avg': 221.0}, {'dept__name': '保全部', 'avg': 21.0}, {'dept__name': '教學部', 'avg': 999.0}]>                                                
​
models.Employee.objects.values("dept__name").annotate(avg=Avg("salary")).values('dept', "avg")
#<QuerySet [{'dept__name': '垃圾部', 'avg': 221.0}, {'dept__name': '保全部', 'avg': 21.0}, {'dept__name': '教學部', 'avg': 999.0}]>  
​
models.Employee.objects.values("dept__name")
#<QuerySet [{'dept__name': '垃圾部'}, {'dept__name': '保全部'}, {'dept__name': '教學部'}]>   

作者、圖書、出版社表關係:

from django.db import models
# 出版社
class Publisher(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
#
class Book(models.Model):
    title = models.CharField(max_length=32)
    publish_date = models.DateField(auto_now_add=True)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    # 創建外鍵,關聯publish
    publisher = models.ForeignKey(to="Publisher")
    # 創建多對多關聯author
    author = models.ManyToManyField(to="Author")
# 作者
class Author(models.Model):
    name = models.CharField(max_length=32)

示例:

1.統計每一本書的作者個數
(1):ret = models.Book.objects.annotate(autor_num=Count("author")).values("title", "autor_num")
#<QuerySet [{'title': '西瓜物語', 'autor_num': 0}, {'title': '香蕉物語', 'autor_num': 1}, {'title': '番茄物語', 'autor_num': 1}]>
​
(2):book_list = models.Book.objects.all().annotate(author_num=Count("author"))
print(book_list)        #<QuerySet [<Book: 西瓜物語>, <Book: 香蕉物語>, <Book: 番茄物語>]>
for obj in book_list:
    print(obj.author_num)#0  1  1
2.統計出每個出版社出版的最便宜的書的價格
(1):ret = models.Publisher.objects.annotate(min_price=Min("book__price")).values("name", "min_price")
#<QuerySet [{'name': '清華出版社', 'min_price': Decimal('0.10')}, {'name': '香江出版社', 'min_price': Decimal('12.00')}, 
{'name': '北大青鳥出版社', 'min_price': None}]>
(2):ret=models.Book.objects.values("publisher__name").annotate(min_price=Min("price"))
#<QuerySet [{'publisher__name': '清華出版社', 'min_price': Decimal('0.10')}, #{'publisher__name': '香江出版社', 'min_price': Decimal('12.00')}]>
​
(3):publisher_list = models.Publisher.objects.annotate(min_price=Min("book__price"))
print(publisher_list)
#<QuerySet [<Publisher: 清華出版社>, <Publisher: 香江出版社>, <Publisher: 北大青鳥出版社>]>
for obj in publisher_list:
    print(obj.min_price)#0.10 12.00 None
3.統計不止一個作者的圖書   
models.Book.objects.annotate(author_num=Count("author")).filter(author_num__gt=1)#<QuerySet []>
4.根據一本圖書作者數量的多少對查詢集 QuerySet進行排序
models.Book.objects.annotate(author_num=Count("author")).order_by("author_num")
#<QuerySet [<Book: 西瓜物語>, <Book: 香蕉物語>, <Book: 番茄物語>]>
5.查詢各個作者出的書的總價格
models.Author.objects.annotate(sum_price=Sum("book__price")).values("name", "sum_price")
#<QuerySet [{'name': '小仙女', 'sum_price': Decimal('1.00')}, {'name': '小魔女', 'sum_price': Decimal('12.00')}, 
#{'name': '大烏龜', 'sum_price': None}, {'name': '張san', 'sum_price': None}]>
12.3213 F查詢

F() 的實例可以在查詢中引用欄位,來比較同一個 model 實例中兩個不同欄位的值。

商品表結構:

from django.db import models
​
class Product(models.Model):
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    # 庫存數
    keep = models.IntegerField()
    # 賣出數
    sale = models.IntegerField()
​
    def __str__(self):
        return  "{}:{}:{}:{}".format(self.name, self.price, self.keep, self.sale)

示例:

from django.db.models import F
1.查詢出賣出數大於庫存數的商品
models.Product.objects.filter(sale__gt=F("keep"))
#<QuerySet [<Product: 跟哪吒學詩歌:59.00:50:10000>, <Product: 跟苑局學三不:55.00:100:200>]>
2.Django支持F()對象之間以及F()對象和常數之間的加減乘除和取模的操作
models.Product.objects.filter(sale__gt=F('keep')*2)
#<QuerySet [<Product: 跟哪吒學詩歌:59.00:50:10000>]>
3.修改操作也可以使用F函數:比如將每個產品的價格提高50元
models.Product.objects.all().update(price=F("price")+50)
4.把所有商品名後面加上"新款"
from django.db.models.functions import Concat
from django.db.models import Value
models.Product.objects.all().update(name=Concat(F("name"),  Value("新款")))
12.3214 Q查詢

filter() 等方法中的關鍵字參數查詢都是一起進行“AND” 的。 如果需要執行更複雜的查詢(例如OR語句),可以使用Q對象

#賣出數大於100 並且 價格大於100塊的
models.Product.objects.filter(sale__gt=100, price__gt=100)
#<QuerySet [<Product: 跟哪吒學詩歌新款:259.00:50:10000>, <Product: 跟苑局學三不新款:255.00:100:200>]>

示例:

from django.db.models import Q
1.查詢賣出數大於100或者價格小於100的
models.Product.objects.filter(Q(sale__gt=100)|Q(price__lt=100))  #|:或
#<QuerySet [<Product: 跟哪吒學詩歌新款:259.00:50:10000>, <Product: 跟苑局學三不新款:255.00:100:200>]>
2.查詢庫存數是100並且賣出數不是0的產品
models.Product.objects.filter(Q(keep=100)&~Q(sale=0))           #&:與,~:非
models.Product.objects.filter(Q(kucun=100),~Q(maichu=0))
#<QuerySet [<Product: 跟苑局學三不新款:255.00:100:200>]>
models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0)).values('name')
#<QuerySet [{'name': '跟苑局學三不新款'}]>
models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0)).values_list('name')
#<QuerySet [('跟苑局學三不新款',)]>

查詢函數可以混合使用Q 對象和關鍵字參數。所有提供給查詢函數的參數(關鍵字參數或Q 對象)都將"AND”在一起。但是,如果出現Q 對象,它必須位於所有關鍵字參數的前面

#查詢產品名包含新款, 並且庫存數大於60或者價格小於100的產品
models.Product.objects.filter(Q(keep__gt=60)|Q(price__lt=100), name__contains="新款")
#<QuerySet [<Product: 跟苑局學三不新款:255.00:100:200>]>
12.3215 事務

開啟一個事務可以包含一些sql語句,這些sql語句要麼同時成功,要麼都不成功,稱之為事務的原子性 作用:事務用於將某些操作的多個SQL作為原子性操作,一旦有某一個出現錯誤,即可回滾到原來的狀態,從而保證資料庫數據完整性。

import os
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
    import django
    django.setup()

    import datetime
    from app01 import models

    try:
        from django.db import transaction
        with transaction.atomic():                                #開啟事務
            new_publisher = models.Publisher.objects.create(name="火星出版社")
            models.Book.objects.create(title="橘子物語", publish_date=datetime.date.today(), publisher_id=10)  
           # 指定一個不存在的出版社id,上一行創建一條出版社數據被回滾,資料庫並未創建新數據
    except Exception as e:
        print(str(e))     
12.3216 Django ORM執行原生SQL

很多情況下我們不需要將查詢結果映射成模型,或者我們需要執行DELETE、 INSERT以及UPDATE操作,在這些情況下,我們可以直接訪問資料庫,完全避開模型層。我們可以直接從django提供的介面中獲取資料庫連接,然後像使用pymysql模塊一樣操作資料庫

from django.db import connection, connections
cursor = connection.cursor()  # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
ret = cursor.fetchone()

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天開始學習設計模式,藉此機會學習並整理學習筆記。 設計模式是一門不區分語言的課程,什麼樣的編程語言都可以用到設計模式。如果說java語法規則比作武功招式的話,那麼設計模式就是心法。 設計模式共有23種,常見的19種,最常用的9-10種。 設計模式分三種類型:創建型、結構型、行為型; 其中創建型包含 ...
  • Django之靜態文件,中間件,admin後臺管理;其中,靜態文件 包括靜態文件的使用,動態生成靜態文件的路徑;中間件包括 使用中間件,使用中間件防爬蟲ip案例;admin後臺管理 包括 admin的使用,列表頁選項,編輯頁選項等。 ...
  • 方法1. 函數:fill 舉例說明:應力分佈雲圖 ...
  • Scala的集合體繫結構 // Scala中的集合體系主要包括:Iterable、Seq、Set、Map。其中Iterable是所有集合trait的根trai。這個結構與Java的集合體系非常相似。 // Scala中的集合是分成可變和不可變兩類集合的,其中可變集合就是說,集合的元素可以動態修改,而 ...
  • 將函數賦值給變數 // Scala中的函數是一等公民,可以獨立定義,獨立存在,而且可以直接將函數作為值賦值給變數 // Scala的語法規定,將函數賦值給變數時,必須在函數後面加上空格和下劃線 def sayHello(name: String) { println("Hello, " + name ...
  • APScheduler是基於Quartz的一個Python定時任務框架。提供了基於日期、固定時間間隔以及crontab類型的任務,並且可以持久化任務。 ...
  • 簡單學習了一些linux相關的知識,自己做一個簡單的總結,可以在一般工作中命令行狀態下裝裝B,哈哈 grep grep xxx yyy.file 查找出yyy文件中存在xxx的行 通配符 * : 空和任意字元 ?: 一個任務字元 . : 匹配任意單字元占位 [1249a]、[a-k]、[^12]:字 ...
  • ArrayBuffer 在Scala中,如果需要類似於Java中的ArrayList這種長度可變的集合類,則可以使用ArrayBuffer。 // 如果不想每次都使用全限定名,則可以預先導入ArrayBuffer類 import scala.collection.mutable.ArrayBuffe ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...