Django(Python框架):Django模型設計與數(shù)據(jù)庫操作_第1頁
Django(Python框架):Django模型設計與數(shù)據(jù)庫操作_第2頁
Django(Python框架):Django模型設計與數(shù)據(jù)庫操作_第3頁
Django(Python框架):Django模型設計與數(shù)據(jù)庫操作_第4頁
Django(Python框架):Django模型設計與數(shù)據(jù)庫操作_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Django(Python框架):Django模型設計與數(shù)據(jù)庫操作1Django模型基礎1.1模型字段類型在Django中,模型字段類型是定義數(shù)據(jù)庫表結(jié)構的關鍵。每種字段類型都有其特定的用途和屬性,下面是一些常見的字段類型:CharField:用于存儲固定長度的字符串,如姓名、地址等。需要指定max_length參數(shù)。TextField:用于存儲長文本,如文章內(nèi)容。沒有長度限制。IntegerField:存儲整數(shù)。FloatField:存儲浮點數(shù)。BooleanField:存儲布爾值,True或False。DateTimeField:存儲日期和時間。ForeignKey:定義與其他模型的一對多關系。OneToOneField:定義與其他模型的一對一關系。ManyToManyField:定義與其他模型的多對多關系。1.1.1示例代碼fromdjango.dbimportmodels

classAuthor(models.Model):

name=models.CharField(max_length=100)

bio=models.TextField()

birth_date=models.DateField()

classBook(models.Model):

title=models.CharField(max_length=200)

author=models.ForeignKey(Author,on_delete=models.CASCADE)

publication_date=models.DateField()

price=models.FloatField()在這個例子中,Author模型包含姓名、簡介和出生日期字段,而Book模型包含標題、作者(與Author模型的外鍵關系)、出版日期和價格字段。1.2模型字段選項模型字段選項允許你進一步定制字段的行為,例如設置默認值、是否允許空值、字段的唯一性等。以下是一些常用的字段選項:null:是否允許數(shù)據(jù)庫字段為NULL。blank:是否允許表單字段為空。default:字段的默認值。unique:字段是否必須是唯一的。choices:字段的可選值列表。help_text:在表單中顯示的字段幫助文本。1.2.1示例代碼fromdjango.dbimportmodels

classCategory(models.Model):

name=models.CharField(max_length=50,unique=True)

description=models.TextField(blank=True,null=True)

classProduct(models.Model):

name=models.CharField(max_length=100)

price=models.FloatField(default=0.0)

category=models.ForeignKey(Category,on_delete=models.CASCADE)

stock=models.IntegerField(default=0)在這個例子中,Category模型的name字段被設置為唯一,而description字段允許為空和空字符串。Product模型的price和stock字段有默認值。1.3模型關系Django支持多種模型間的關系,包括一對一、一對多和多對多關系。這些關系通過特定的字段類型來定義。1.3.1示例代碼fromdjango.dbimportmodels

classProfile(models.Model):

user=models.OneToOneField(User,on_delete=models.CASCADE)

bio=models.TextField()

classPost(models.Model):

author=models.ForeignKey(User,on_delete=models.CASCADE)

title=models.CharField(max_length=200)

content=models.TextField()

classTag(models.Model):

name=models.CharField(max_length=50)

posts=models.ManyToManyField(Post)在這個例子中,Profile模型與User模型是一對一關系,Post模型與User模型是一對多關系,而Tag模型與Post模型是多對多關系。1.4模型方法模型方法可以添加額外的功能,如自定義保存方法、計算屬性等。下面是一個自定義保存方法的例子:1.4.1示例代碼fromdjango.dbimportmodels

classBook(models.Model):

title=models.CharField(max_length=200)

author=models.CharField(max_length=100)

publication_date=models.DateField()

defsave(self,*args,**kwargs):

#在保存前執(zhí)行一些邏輯,例如檢查標題是否為空

ifnotself.title:

raiseValueError("Titlecannotbeempty")

super().save(*args,**kwargs)

def__str__(self):

returnf"{self.title}by{self.author}"在這個例子中,Book模型有一個自定義的save方法,用于在保存前檢查標題是否為空。同時,__str__方法被重寫,以便在管理界面中更友好地顯示模型實例。以上就是Django模型設計與數(shù)據(jù)庫操作的基礎內(nèi)容,通過這些知識,你可以開始構建復雜的數(shù)據(jù)模型,并有效地與數(shù)據(jù)庫進行交互。2模型設計最佳實踐2.1數(shù)據(jù)規(guī)范化數(shù)據(jù)規(guī)范化是數(shù)據(jù)庫設計中的一個關鍵步驟,旨在減少數(shù)據(jù)冗余和提高數(shù)據(jù)完整性。在Django中,通過合理設計模型字段和關系,可以實現(xiàn)數(shù)據(jù)的規(guī)范化。2.1.1示例:避免冗余字段假設我們有以下兩個模型,分別代表Department(部門)和Employee(員工):fromdjango.dbimportmodels

classDepartment(models.Model):

name=models.CharField(max_length=100)

location=models.CharField(max_length=100)

classEmployee(models.Model):

name=models.CharField(max_length=100)

department_name=models.CharField(max_length=100)#冗余字段

department_location=models.CharField(max_length=100)#冗余字段

position=models.CharField(max_length=100)這里,Employee模型中的department_name和department_location字段是冗余的,因為這些信息已經(jīng)存儲在Department模型中。更好的設計是使用外鍵關系:fromdjango.dbimportmodels

classDepartment(models.Model):

name=models.CharField(max_length=100)

location=models.CharField(max_length=100)

classEmployee(models.Model):

department=models.ForeignKey(Department,on_delete=models.CASCADE)

name=models.CharField(max_length=100)

position=models.CharField(max_length=100)這樣,每個員工都關聯(lián)到一個部門,避免了數(shù)據(jù)的重復存儲,提高了數(shù)據(jù)的一致性和完整性。2.2使用抽象基類抽象基類在Django模型中用于定義一組通用字段,這些字段可以被多個模型繼承,而不會創(chuàng)建額外的數(shù)據(jù)庫表。2.2.1示例:通用信息模型假設我們有多個模型,如Article、Comment和User,它們都需要包含創(chuàng)建時間和更新時間的字段。我們可以創(chuàng)建一個抽象基類TimestampedModel:fromdjango.dbimportmodels

fromdjango.utilsimporttimezone

classTimestampedModel(models.Model):

created_at=models.DateTimeField(auto_now_add=True)

updated_at=models.DateTimeField(auto_now=True)

classMeta:

abstract=True然后,其他模型可以繼承這個抽象基類:classArticle(TimestampedModel):

title=models.CharField(max_length=200)

content=models.TextField()

classComment(TimestampedModel):

text=models.CharField(max_length=200)

article=models.ForeignKey(Article,on_delete=models.CASCADE)

classUser(TimestampedModel):

username=models.CharField(max_length=50)

email=models.EmailField()這樣,Article、Comment和User模型都將自動包含created_at和updated_at字段,而無需為這些字段創(chuàng)建額外的數(shù)據(jù)庫表。2.3模型繼承Django模型可以繼承自其他模型,這允許我們創(chuàng)建具有共同屬性的模型基類,然后由具體模型繼承這些屬性。2.3.1示例:員工與經(jīng)理模型假設我們想要創(chuàng)建一個Manager模型,它繼承自Employee模型,但添加了額外的managed_department字段:fromdjango.dbimportmodels

classEmployee(models.Model):

name=models.CharField(max_length=100)

department=models.ForeignKey(Department,on_delete=models.CASCADE)

position=models.CharField(max_length=100)

classManager(Employee):

managed_department=models.ForeignKey(Department,on_delete=models.CASCADE,related_name='managers')這里,Manager模型繼承了Employee模型的所有字段,并添加了managed_department字段。在數(shù)據(jù)庫中,Manager將被視為Employee的一個子類,而不會創(chuàng)建一個額外的表。2.4模型信號Django的信號允許模型在某些操作(如創(chuàng)建、更新或刪除)時觸發(fā)事件。這可以用于執(zhí)行額外的邏輯,如更新相關數(shù)據(jù)或發(fā)送通知。2.4.1示例:員工入職通知假設我們想要在員工創(chuàng)建時發(fā)送一個通知。我們可以使用post_save信號來實現(xiàn):fromdjango.dbimportmodels

fromdjango.dispatchimportreceiver

fromdjango.core.mailimportsend_mail

classEmployee(models.Model):

name=models.CharField(max_length=100)

department=models.ForeignKey(Department,on_delete=models.CASCADE)

position=models.CharField(max_length=100)

@receiver(models.signals.post_save,sender=Employee)

defsend_employee_welcome_email(sender,instance,created,**kwargs):

ifcreated:

send_mail(

'Welcometoourcompany',

f'Dear{},\n\nWelcometoourcompany.Wearegladtohaveyouonboard.',

'from@',

[instance.email],

fail_silently=False,

)在這個例子中,send_employee_welcome_email函數(shù)是一個信號接收器,它在Employee模型的實例被創(chuàng)建后發(fā)送一封歡迎郵件。通過使用信號,我們可以將業(yè)務邏輯與模型操作解耦,使得代碼更加模塊化和可維護。以上示例展示了如何在Django中應用數(shù)據(jù)規(guī)范化、抽象基類、模型繼承和模型信號,以創(chuàng)建更高效、更一致和更易于維護的模型設計。3數(shù)據(jù)庫操作3.1查詢數(shù)據(jù)在Django中,查詢數(shù)據(jù)主要通過模型的objects管理器進行。objects是一個默認的管理器,可以調(diào)用各種方法來執(zhí)行數(shù)據(jù)庫查詢。3.1.1示例代碼#假設我們有一個名為Book的模型

frommyapp.modelsimportBook

#查詢所有書籍

all_books=Book.objects.all()

#查詢第一條數(shù)據(jù)

first_book=Book.objects.first()

#查詢最后一條數(shù)據(jù)

last_book=Book.objects.last()

#查詢特定id的書籍

book=Book.objects.get(id=1)

#查詢特定條件的書籍

books_by_author=Book.objects.filter(author='JohnDoe')3.1.2描述all()方法返回模型的所有實例。first()和last()方法分別返回查詢結(jié)果中的第一條和最后一條數(shù)據(jù)。get()方法用于獲取單個對象,如果找不到或找到多個,會拋出異常。filter()方法用于根據(jù)指定的條件過濾數(shù)據(jù)。3.2過濾數(shù)據(jù)過濾數(shù)據(jù)是Django數(shù)據(jù)庫操作中最常用的功能之一,它允許你根據(jù)模型字段的值來選擇數(shù)據(jù)。3.2.1示例代碼#查詢價格在10到20之間的書籍

books_in_price_range=Book.objects.filter(price__gte=10,price__lte=20)

#查詢標題包含“Python”的書籍

books_with_python=Book.objects.filter(title__contains='Python')

#查詢出版日期在2020年之后的書籍

books_after_2020=Book.objects.filter(publication_date__year__gt=2020)

#查詢作者為“JohnDoe”且價格低于15的書籍

books_by_john_under_15=Book.objects.filter(author='JohnDoe',price__lt=15)3.2.2描述price__gte和price__lte分別表示價格大于等于和小于等于。title__contains用于查找標題中包含特定字符串的書籍。publication_date__year__gt用于過濾出版年份大于指定值的書籍。過濾條件可以組合使用,如同時過濾作者和價格。3.3排序數(shù)據(jù)Django允許你對查詢結(jié)果進行排序,可以按照升序或降序排列。3.3.1示例代碼#按價格升序排序

books_sorted_by_price_asc=Book.objects.all().order_by('price')

#按價格降序排序

books_sorted_by_price_desc=Book.objects.all().order_by('-price')

#按出版日期升序排序,然后按價格降序排序

books_sorted_by_date_and_price=Book.objects.all().order_by('publication_date','-price')3.3.2描述order_by()方法用于排序,字段前加-表示降序??梢酝瑫r指定多個排序字段,Django會按照指定的順序進行排序。3.4聚合數(shù)據(jù)聚合數(shù)據(jù)是Django中處理數(shù)據(jù)集的統(tǒng)計信息,如計算平均值、最大值、最小值等。3.4.1示例代碼fromdjango.db.modelsimportAvg,Max,Min,Count,Sum

#計算所有書籍的平均價格

average_price=Book.objects.all().aggregate(Avg('price'))

#找到最貴的書籍的價格

max_price=Book.objects.all().aggregate(Max('price'))

#找到最便宜的書籍的價格

min_price=Book.objects.all().aggregate(Min('price'))

#計算書籍總數(shù)

total_books=Book.objects.all().aggregate(Count('id'))

#計算所有書籍的總價格

total_price=Book.objects.all().aggregate(Sum('price'))3.4.2描述aggregate()方法用于執(zhí)行聚合操作,可以使用Django提供的聚合函數(shù)如Avg、Max、Min、Count和Sum。聚合函數(shù)需要指定要操作的字段,如Avg('price')計算價格的平均值。聚合操作返回一個字典,其中鍵是聚合函數(shù)的別名,值是計算結(jié)果。以上示例展示了如何在Django中執(zhí)行基本的數(shù)據(jù)庫操作,包括查詢、過濾、排序和聚合數(shù)據(jù)。這些操作是構建復雜查詢和數(shù)據(jù)處理任務的基礎。4Django模型實例操作4.1創(chuàng)建實例在Django中,模型實例的創(chuàng)建是與數(shù)據(jù)庫交互的基礎。當你定義了一個模型后,可以通過實例化該模型類來創(chuàng)建新的數(shù)據(jù)庫記錄。4.1.1示例代碼#models.py

fromdjango.dbimportmodels

classBook(models.Model):

title=models.CharField(max_length=100)

author=models.CharField(max_length=100)

publication_date=models.DateField()

price=models.DecimalField(max_digits=5,decimal_places=2)

#views.py

from.modelsimportBook

fromdatetimeimportdate

defcreate_book(request):

#創(chuàng)建一個Book實例

book=Book(title="Python編程",author="GuidovanRossum",publication_date=date(2020,1,1),price=59.99)

#保存到數(shù)據(jù)庫

book.save()4.1.2描述在上述代碼中,我們首先從models.py導入了Book模型。然后在views.py中,我們創(chuàng)建了一個Book實例,設置了其屬性,如標題、作者、出版日期和價格,最后調(diào)用save()方法將這個實例保存到數(shù)據(jù)庫中。4.2更新實例更新模型實例意味著修改數(shù)據(jù)庫中已存在的記錄。這可以通過加載實例,修改其屬性,然后再次保存來實現(xiàn)。4.2.1示例代碼#views.py

from.modelsimportBook

defupdate_book(request):

#加載Book實例

book=Book.objects.get(title="Python編程")

#修改屬性

book.price=69.99

#保存更改

book.save()4.2.2描述在這個例子中,我們使用Book.objects.get()方法來從數(shù)據(jù)庫中加載一個特定的Book實例。然后,我們修改了price屬性,將其從59.99更新為69.99,最后再次調(diào)用save()方法來保存這些更改到數(shù)據(jù)庫。4.3刪除實例刪除模型實例意味著從數(shù)據(jù)庫中永久移除一條記錄。這可以通過調(diào)用實例的delete()方法來實現(xiàn)。4.3.1示例代碼#views.py

from.modelsimportBook

defdelete_book(request):

#加載Book實例

book=Book.objects.get(title="Python編程")

#刪除實例

book.delete()4.3.2描述在刪除實例的代碼中,我們首先使用Book.objects.get()來加載一個特定的Book實例。然后,我們調(diào)用delete()方法來從數(shù)據(jù)庫中刪除這個實例。這將永久移除該記錄,因此在執(zhí)行此操作前應謹慎。4.4實例方法Django允許你在模型類中定義自定義方法,這些方法可以用于執(zhí)行與該模型實例相關的特定操作。4.4.1示例代碼#models.py

fromdjango.dbimportmodels

fromdatetimeimportdate

classBook(models.Model):

title=models.CharField(max_length=100)

author=models.CharField(max_length=100)

publication_date=models.DateField()

price=models.DecimalField(max_digits=5,decimal_places=2)

defis_recent(self):

"""檢查書籍是否在最近一年內(nèi)出版"""

returnself.publication_date>=date.today()-relativedelta(years=1)4.4.2描述在models.py中,我們定義了一個is_recent()方法,該方法檢查書籍的publication_date屬性是否在最近一年內(nèi)。這可以通過比較當前日期與書籍的出版日期來實現(xiàn)。在實際應用中,你可能需要導入relativedelta函數(shù),它來自dateutil.relativedelta模塊,用于計算日期差。4.5總結(jié)通過上述示例,我們了解了如何在Django中創(chuàng)建、更新、刪除模型實例,以及如何定義和使用實例方法。這些操作是Django應用中數(shù)據(jù)管理的核心部分,掌握它們對于開發(fā)功能豐富的Web應用至關重要。5高級數(shù)據(jù)庫功能5.1事務管理事務管理是Django中一個重要的高級數(shù)據(jù)庫功能,它確保了數(shù)據(jù)庫操作的原子性、一致性、隔離性和持久性(ACID)。在Django中,你可以使用transaction.atomic()裝飾器或withtransaction.atomic()上下文管理器來控制事務的邊界。5.1.1示例:使用事務管理假設我們有兩個模型Order和Product,我們需要在創(chuàng)建訂單時更新產(chǎn)品的庫存。如果庫存更新失敗,我們不希望訂單被創(chuàng)建。fromdjango.dbimporttransaction

from.modelsimportOrder,Product

defcreate_order(product_id,quantity):

try:

withtransaction.atomic():

product=Product.objects.select_for_update().get(id=product_id)

ifproduct.stock<quantity:

raiseException("庫存不足")

product.stock-=quantity

product.save()

order=Order.objects.create(product=product,quantity=quantity)

exceptExceptionase:

print(e)在這個例子中,我們使用transaction.atomic()上下文管理器來確保product.stock-=quantity和product.save()這兩個操作在一個事務中完成。如果任何操作失敗,整個事務將被回滾,確保數(shù)據(jù)的一致性。5.2數(shù)據(jù)庫連接池Django默認使用數(shù)據(jù)庫連接池來管理數(shù)據(jù)庫連接,這可以提高應用程序的性能,尤其是在處理大量并發(fā)請求時。連接池允許應用程序重用數(shù)據(jù)庫連接,而不是為每個請求創(chuàng)建和銷毀連接。5.2.1如何配置在settings.py中,你可以通過設置CONN_MAX_AGE參數(shù)來控制連接池的連接最大年齡,超過這個時間的連接將被關閉并重新創(chuàng)建。DATABASES={

'default':{

'ENGINE':'django.db.backends.postgresql',

'NAME':'mydatabase',

'USER':'mydatabaseuser',

'PASSWORD':'mypassword',

'HOST':'',

'PORT':'5432',

'CONN_MAX_AGE':600,#設置連接的最大年齡為600秒

}

}5.3數(shù)據(jù)庫路由Django的數(shù)據(jù)庫路由功能允許你根據(jù)特定的規(guī)則將模型的讀寫操作路由到不同的數(shù)據(jù)庫。這對于實現(xiàn)讀寫分離、數(shù)據(jù)分片等場景非常有用。5.3.1示例:定義路由規(guī)則首先,你需要在settings.py中定義多個數(shù)據(jù)庫,并指定一個路由類。DATABASES={

'default':{

'ENGINE':'django.db.backends.postgresql',

'NAME':'mydatabase',

},

'slave':{

'ENGINE':'django.db.backends.postgresql',

'NAME':'mydatabase_slave',

}

}

DATABASE_ROUTERS=['myapp.routers.SlaveRouter']然后,創(chuàng)建一個路由類,實現(xiàn)db_for_read()和db_for_write()方法。#myapp/routers.py

classSlaveRouter:

defdb_for_read(self,model,**hints):

ifmodel._meta.app_label=='myapp':

return'slave'

returnNone

defdb_for_write(self,model,**hints):

ifmodel._meta.app_label=='myapp':

return'default'

returnNone在這個例子中,所有對myapp應用的模型的讀操作將被路由到slave數(shù)據(jù)庫,而寫操作將被路由到default數(shù)據(jù)庫。5.4自定義數(shù)據(jù)庫后端Django允許你自定義數(shù)據(jù)庫后端,以支持除了默認支持的數(shù)據(jù)庫之外的其他數(shù)據(jù)庫系統(tǒng)。自定義后端需要實現(xiàn)Django的數(shù)據(jù)庫API,包括查詢、事務管理、連接管理等。5.4.1示例:自定義后端自定義數(shù)據(jù)庫后端需要創(chuàng)建一個新的Python包,實現(xiàn)base.DatabaseWrapper類。以下是一個簡單的自定義后端示例,用于支持一個假設的數(shù)據(jù)庫系統(tǒng)mydb。#mydb/backends/__init__.py

fromdjango.db.backends.base.baseimportBaseDatabaseWrapper

fromdjango.db.backends.base.featuresimportBaseDatabaseFeatures

fromdjango.db.backends.base.clientimportBaseDatabaseClient

fromdjango.db.backends.base.creationimportBaseDatabaseCreation

fromrospectionimportBaseDatabaseIntrospection

fromdjango.db.backends.base.operationsimportBaseDatabaseOperations

fromdjango.db.backends.base.schemaimportBaseDatabaseSchemaEditor

classDatabaseWrapper(BaseDatabaseWrapper):

vendor='mydb'

#實現(xiàn)BaseDatabaseWrapper中的所有方法

#mydb/backends/base.py

classDatabaseFeatures(BaseDatabaseFeatures):

#實現(xiàn)BaseDatabaseFeatures中的所有方法

classDatabaseClient(BaseDatabaseClient):

#實現(xiàn)BaseDatabaseClient中的所有方法

classDatabaseCreation(BaseDatabaseCreation):

#實現(xiàn)BaseDatabaseCreation中的所有方法

classDatabaseIntrospection(BaseDatabaseIntrospection):

#實現(xiàn)BaseDatabaseIntrospection中的所有方法

classDatabaseOperations(BaseDatabaseOperations):

#實現(xiàn)BaseDatabaseOperations中的所有方法

classDatabaseSchemaEditor(BaseDatabaseSchemaEditor):

#實現(xiàn)BaseDatabaseSchemaEditor中的所有方法然后,在settings.py中配置你的自定義后端。DATABASES={

'default':{

'ENGINE':'mydb.backends.mydb',

'NAME':'mydatabase',

}

}自定義后端需要實現(xiàn)Django數(shù)據(jù)庫API的所有方法,這通常需要對目標數(shù)據(jù)庫系統(tǒng)有深入的理解。在實際應用中,你可能需要參考Django的源代碼和其他已支持的數(shù)據(jù)庫后端實現(xiàn)來完成這個任務。6模型與表單6.1表單字段與模型字段在Django中,模型字段和表單字段雖然在功能上有所不同,但它們之間存在緊密的聯(lián)系。模型字段用于定義數(shù)據(jù)庫表結(jié)構,而表單字段則用于處理用戶輸入。理解兩者之間的關系對于構建高效且用戶友好的Web應用至關重要。6.1.1模型字段示例假設我們有一個User模型,用于存儲用戶信息:fromdjango.dbimportmodels

classUser(models.Model):

username=models.CharField(max_length=100)

email=models.EmailField()

age=models.IntegerField()6.1.2表單字段映射為了創(chuàng)建一個表單來處理User模型的輸入,我們可以定義一個UserForm,其中的字段與模型字段相對應:fromdjangoimportforms

from.modelsimportUser

classUserForm(forms.ModelForm):

classMeta:

model=User

fields=['username','email','age']在這個例子中,User

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論