Django教程四(mysql CRUD)

數(shù)據(jù)庫(kù)的操作(CRUD操作)

  • CRUD是指在做計(jì)算處理時(shí)的增加(Create)、讀取查詢(xún)(Read)、更新(Update)和刪除(Delete)

管理器對(duì)象

  • 每個(gè)繼承自 models.Model 的模型類(lèi),都會(huì)有一個(gè) objects 對(duì)象被同樣繼承下來(lái)。這個(gè)對(duì)象叫管理器對(duì)象
  • 數(shù)據(jù)庫(kù)的增刪改查可以通過(guò)模型的管理器實(shí)現(xiàn)
    class Entry(models.Model):
        ...
    Entry.objects.create(...) # 是管理器對(duì)象
    

創(chuàng)建數(shù)據(jù)對(duì)象

  • Django 使用一種直觀的方式把數(shù)據(jù)庫(kù)表中的數(shù)據(jù)表示成Python 對(duì)象

  • 創(chuàng)建數(shù)據(jù)中每一條記錄就是創(chuàng)建一個(gè)數(shù)據(jù)對(duì)象

    1. Entry.objects.create(屬性1=值1, 屬性2=值1,...)
      • 成功: 返回創(chuàng)建好的實(shí)體對(duì)象
      • 失敗: 拋出異常
    2. 創(chuàng)建 Entry 實(shí)體對(duì)象,并調(diào)用 save() 進(jìn)行保存
      obj = Entry(屬性=值,屬性=值)
      obj.屬性=值
      obj.save()
      無(wú)返回值,保存成功后,obj會(huì)被重新賦值
      
    3. 示例1:
      try:
          abook = Book.objects.create(title='Python', pub='清華大學(xué)出版社')
          print(abook)
      except:
          print('創(chuàng)建對(duì)象失敗')
      
    4. 示例2:
      try:
          abook = Book(title='Python', pub='清華大學(xué)出版社')
          abook.save()
          print(abook)
      except:
          print('創(chuàng)建對(duì)象失敗')
      
    5. 示例3:
      try:
          abook = Book()
          abook.title='Python'
          abook.pub='清華大學(xué)出版社'
          abook.save()
          print(abook)
      except:
          print('創(chuàng)建對(duì)象失敗')
      
    • 練習(xí):
      • 使用以上三種方式,分別向Book和Publisher表中各增加三條數(shù)據(jù)

Django shell 的使用

  • 在Django提供了一個(gè)交互式的操作項(xiàng)目叫 Django Shell 它能夠在交互模式用項(xiàng)目工程的代碼執(zhí)行相應(yīng)的操作

  • 利用 Django Shell 可以代替編寫(xiě)View的代碼來(lái)進(jìn)行直接操作

  • 在Django Shell 下只能進(jìn)行簡(jiǎn)單的操作,不能運(yùn)行遠(yuǎn)程調(diào)式

  • 啟動(dòng) Django shell 顯示IPython風(fēng)格的交互界面如下:

    $ python3 manage.py shell
    manage.py shell
    Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04) 
    Type 'copyright', 'credits' or 'license' for more information
    IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
    
    In [1]: 
    In [2]: from bookstore import models
    In [3]: models.Book.objects.create(title="Python")
    Out[3]: <Book: Book object>
    In [4]: book = models.Book.objects.create(title='C++')
    In [4]: print(book)
    Book object
    
  • 練習(xí):

    在 bookstore/models.py 應(yīng)用中添加兩個(gè)model類(lèi)
    1. Book - 圖書(shū)
        1. title - CharField 書(shū)名,非空,唯一
        2. pub - CharField 出版社,字符串,非空
        3. price - 圖書(shū)價(jià)格,,
        4. market_price - 圖書(shū)零售價(jià)
    2. Author - 作者
        1. name - CharField 姓名,非空,唯一,加索引
        2. age - IntegerField, 年齡,非空,缺省值為1
        3. email - EmailField, 郵箱,允許為空
    
    • 然后用Django Shell 添加如下數(shù)據(jù)
      • 圖書(shū)信息
        書(shū)名 定價(jià) 零售價(jià) 出版社
        Python 20.00 25.00 清華大學(xué)出版社
        Python3 60.00 65.00 清華大學(xué)出版社
        Django 70.00 75.00 清華大學(xué)出版社
        JQuery 90.00 85.00 機(jī)械工業(yè)出版社
        Linux 80.00 65.00 機(jī)械工業(yè)出版社
        Windows 50.00 35.00 機(jī)械工業(yè)出版社
        HTML5 90.00 105.00 清華大學(xué)出版社
      • 作者信息:
        姓名 年齡 郵箱
        王老師 28 wangwc@tedu.cn
        呂老師 31 lvze@tedu.cn
        祁老師 30 qitx@tedu.cn
查詢(xún)數(shù)據(jù)
  • 數(shù)據(jù)庫(kù)的查詢(xún)需要使用管理器對(duì)象進(jìn)行
  • 通過(guò) Entry.objects 管理器方法調(diào)用查詢(xún)接口
    方法 說(shuō)明
    all() 查詢(xún)?nèi)坑涗?返回QuerySet查詢(xún)對(duì)象
    get() 查詢(xún)符合條件的單一記錄
    filter() 查詢(xún)符合條件的多條記錄
    exclude() 查詢(xún)符合條件之外的全部記錄
    ...
  1. all()方法

    • 方法: all()
    • 用法: Entry.objects.all()
    • 作用: 查詢(xún)Entry實(shí)體中所有的數(shù)據(jù)
      • 等同于
        • select * from tabel
    • 返回值: QuerySet容器對(duì)象,內(nèi)部存放Entry 實(shí)例
    • 示例:
      from bookstore import models
      books = models.Book.objects.all()
      for book in books:
          print("書(shū)名", book.title, '出版社:', book.pub)
      
  2. 在模型類(lèi)中定義 def __str__(self): 方法可以將自定義對(duì)象轉(zhuǎn)化為字符串

    class Book(models.Model):
        title = ...
        def __str__(self):
            return "書(shū)名: %s, 出版社: %s, 定價(jià): %s" % (self.title, self.pub, self.price)
    
  3. 查詢(xún)返回指定列(字典表示)

    • 方法: values('列1', '列2')
    • 用法: Entry.objects.values(...)
    • 作用: 查詢(xún)部分列的數(shù)據(jù)并返回
      • select 列1,列2 from xxx
    • 返回值: QuerySet
      • 返回查詢(xún)結(jié)果容器,容器內(nèi)存字典,每個(gè)字典代表一條數(shù)據(jù),
      • 格式為: {'列1': 值1, '列2': 值2}
    • 示例:
      from bookstore import models
      books = models.Book.objects.values("title", "pub")
      for book in books:
          print("書(shū)名", book["title"], '出版社:', book['pub'])
          print("book=", book)
      
  4. 查詢(xún)返回指定列(元組表示)

    • 方法:values_list('列1','列2')
    • 用法:Entry.objects.values_list(...)
    • 作用:
      • 返回元組形式的查詢(xún)結(jié)果
    • 返回值: QuerySet容器對(duì)象,內(nèi)部存放 元組
      • 會(huì)將查詢(xún)出來(lái)的數(shù)據(jù)封裝到元組中,再封裝到查詢(xún)集合QuerySet中
    • 示例:
      from bookstore import models
      books = models.Book.objects.values_list("title", "pub")
      for book in books:
          print("book=", book)  # ('Python', '清華大學(xué)出版社')...
      
  5. 排序查詢(xún)

    • 方法:order_by

    • 用法:Entry.objects.order_by('-列','列')

    • 作用:

      • 與all()方法不同,它會(huì)用SQL 語(yǔ)句的ORDER BY 子句對(duì)查詢(xún)結(jié)果進(jìn)行根據(jù)某個(gè)字段選擇性的進(jìn)行排序
    • 說(shuō)明:

      • 默認(rèn)是按照升序排序,降序排序則需要在列前增加'-'表示
    • 示例:

      from bookstore import models
      books = models.Book.objects.order_by("price")
      for book in books:
          print("書(shū)名:", book.title, '價(jià)格:', book.price)
      
  6. 根據(jù)條件查詢(xún)多條記錄

    • 方法: filter(條件)
    • 語(yǔ)法:
      Entry.objects.filter(屬性1=值1, 屬性2=值2)
      
    • 返回值:
      • QuerySet容器對(duì)象,內(nèi)部存放 Entry 實(shí)例
    • 說(shuō)明:
      • 當(dāng)多個(gè)屬性在一起時(shí)為與關(guān)系,即當(dāng)Books.objects.filter(price=20, pub="清華大學(xué)出版社") 返回價(jià)格為20 出版社為"清華大學(xué)出版社"的全部圖書(shū)
    • 示例:
      # 查詢(xún)書(shū)中出版社為"清華大學(xué)出版社"的圖書(shū)
      from bookstore import models
      books = models.Book.objects.filter(pub="清華大學(xué)出版社")
      for book in books:
          print("書(shū)名:", book.title)
      
      2. 查詢(xún)Author實(shí)體中id為1并且isActive為T(mén)rue的
          - authors=Author.objects.filter(id=1,isActive=True)
      

字段查找

  • 字段查詢(xún)是指如何指定SQL語(yǔ)句中 WHERE 子句的內(nèi)容。
  • 字段查詢(xún)需要通過(guò)QuerySet的filter(), exclude() and get()的關(guān)鍵字參數(shù)指定。
  • 非等值條件的構(gòu)建,需要使用字段查詢(xún)
  • 示例:
    # 查詢(xún)作者中年齡大于30
    Author.objects.filter(age__gt = 30)
    # 對(duì)應(yīng)
    SELECT .... WHERE AGE > 35;
    
查詢(xún)謂詞
  • 每一個(gè)查詢(xún)謂詞是一個(gè)獨(dú)立的查詢(xún)功能
  1. __exact : 等值匹配
    Author.objects.filter(id__exact=1)
    select * from author where id = 1
    
  2. __contains : 包含指定值
    Author.objects.filter(name__contains='w')
    select * from author where name like '%w%'
    
  3. __startswith : 以 XXX 開(kāi)始
  4. __endswith : 以 XXX 開(kāi)始
  5. __gt : 大于指定值
    Author.objects.filer(age__gt=50)
    select * from author where age > 50
    
  6. __gte : 大于等于
  7. __lt : 小于
  8. __lte : 小于等于
  9. __in : 查找數(shù)據(jù)是否在指定范圍內(nèi)
    • 示例
    Author.objects.filter(country__in=['中國(guó)','日本','韓國(guó)'])
    # 等同于
    select * from author where country in ('中國(guó)','日本','韓國(guó)')
    
  10. __range: 查找數(shù)據(jù)是否在指定的區(qū)間范圍內(nèi)
    # 查找年齡在某一區(qū)間內(nèi)的所有作者
    Author.objects.filter(age__range=(35,50))
    # 等同于
    SELECT ... WHERE Author BETWEEN 35 and 50;
    
  11. 詳細(xì)內(nèi)容參見(jiàn): https://docs.djangoproject.com/en/1.11/ref/models/querysets/#field-lookups
  • 示例

    Entry.objects.filter(id__gt=4)
    SQL等效:
    
    SELECT ... WHERE id > 4;
    
  • 練習(xí):

    1. 查詢(xún)Author表中age大于等于85的信息
      • Author.objects.filter(age__gte=85)
    2. 查詢(xún)Author表中姓王的人的信息
      • Author.objects.filter(name__startswith='王')
    3. 查詢(xún)Author表中Email中包含"wc"的人的信息
      • Author.objects.filter(email__contains='in')
  1. 不等的條件篩選

    • 語(yǔ)法:
      Entry.objects.exclude(條件)
    • 作用:
      • 返回不包含此 條件 的 作部的數(shù)據(jù)集
    • 示例:
      • 查詢(xún) 清華大學(xué)出版社,價(jià)格大于50 以外的全部圖書(shū)
      books = models.Book.objects.exclude(pub=清華大學(xué)出版社, price__lt=50)
      for book in books:
          print(book)
      
  2. 查詢(xún)指定的一條數(shù)據(jù)

    • 語(yǔ)法:
      Entry.objects.get(條件)
    • 作用:
      • 返回滿(mǎn)足條件的唯一一條數(shù)據(jù)
    • 返回值:
      • Entry 對(duì)象
    • 說(shuō)明:
      • 該方法只能返回一條數(shù)據(jù)
      • 查詢(xún)結(jié)果多余一條數(shù)據(jù)則拋出,Model.MultipleObjectsReturned異常
      • 查詢(xún)結(jié)果如果沒(méi)有數(shù)據(jù)則拋出Model.DoesNotExist異常
    • 示例:
      from bookstore import models
      book = models.Book.object.get(id=1)
      print(book.title)
      

修改數(shù)據(jù)記錄

  1. 修改單個(gè)實(shí)體的某些字段值
      • 通過(guò) get() 得到要修改的實(shí)體對(duì)象
      • 通過(guò) 對(duì)象.屬性 的方式修改數(shù)據(jù)
    1. 保存
      • 通過(guò) 對(duì)象.save() 保存數(shù)據(jù)
    • 如:
      from bookstore import models
      abook = models.Book.objects.get(id=10)
      abook.market_price = "10.5"
      abook.save()
      
  2. 通過(guò) QuerySet 批量修改 對(duì)應(yīng)的全部字段
    • 直接調(diào)用QuerySet的update(屬性=值) 實(shí)現(xiàn)批量修改
    • 如:
      # 將 id大于3的所有圖書(shū)價(jià)格定為0元
      books = Book.objects.filter(id__gt=3)
      books.update(price=0)
      # 將所有書(shū)的零售價(jià)定為100元
      books = Book.objects.all()
      books.update(market_price=100)
      

刪除記錄

  • 刪除記錄是指刪除數(shù)據(jù)庫(kù)中的一條或多條記錄
  • 刪除單個(gè)Entry對(duì)象或刪除一個(gè)查詢(xún)結(jié)果集(QuerySet)中的全部對(duì)象都是調(diào)用 delete()方法
  1. 刪除單個(gè)對(duì)象
    • 步驟
      1. 查找查詢(xún)結(jié)果對(duì)應(yīng)的一個(gè)數(shù)據(jù)對(duì)象
      2. 調(diào)用這個(gè)數(shù)據(jù)對(duì)象的delete()方法實(shí)現(xiàn)刪除
    • 示例:
      try:
          auth = Author.objects.get(id=1)
          auth.delete()
      except:
          print(刪除失敗)
      
  2. 刪除查詢(xún)結(jié)果集
    • 步驟
      1. 查找查詢(xún)結(jié)果集中滿(mǎn)足條件的全部QuerySet查詢(xún)集合對(duì)象
      2. 調(diào)用查詢(xún)集合對(duì)象的delete()方法實(shí)現(xiàn)刪除
    • 示例:
      # 刪除全部作者中,年齡大于65的全部信息
      auths = Author.objects.filter(age__gt=65)
      auths.delete()
      

聚合查詢(xún)

  • 聚合查詢(xún)是指對(duì)一個(gè)數(shù)據(jù)表中的一個(gè)字段的數(shù)據(jù)進(jìn)行部分或全部進(jìn)行統(tǒng)計(jì)查詢(xún),查bookstore_book數(shù)據(jù)表中的全部書(shū)的平均價(jià)格,查詢(xún)所有書(shū)的總個(gè)數(shù)等,都要使用聚合查詢(xún)
  1. 不帶分組聚合
    • 不帶分組的聚合查詢(xún)是指導(dǎo)將全部數(shù)據(jù)進(jìn)行集中統(tǒng)計(jì)查詢(xún)
    • 聚合函數(shù):
      • 定義模塊: django.db.models
      • 用法: from django.db.models import *
      • 聚合函數(shù):
        • Sum, Avg, Count, Max, Min
    • 語(yǔ)法:
      • Entry.objects.aggregate(結(jié)果變量名=聚合函數(shù)('列'))
    • 返回結(jié)果:
      • 由 結(jié)果變量名和值組成的字典
      • 格式為:
        • `{"結(jié)果變量名": 值}
    • 示例:
      # 得到所有書(shū)的平均價(jià)格
      from bookstore import models
      from django.db.models import Count
      result = models.Book.objects.aggregate(myAvg=Avg('price'))
      print("平均價(jià)格是:", result['myAvg'])
      print("result=", result)  # {"myAvg": 58.2}
      
      # 得到數(shù)據(jù)表里有多少本書(shū)
      from django.db.models import Count
      result = models.Book.objects.aggregate(mycnt=Count('title'))
      print("數(shù)據(jù)記錄總個(gè)數(shù)是:", result['mycnt'])
      print("result=", result)  # {"mycnt": 10}
      
      
  2. 分組聚合
    • 分組聚合是指通過(guò)計(jì)算查詢(xún)結(jié)果中每一個(gè)對(duì)象所關(guān)聯(lián)的對(duì)象集合,從而得出總計(jì)值(也可以是平均值或總和),即為查詢(xún)集的每一項(xiàng)生成聚合。

    • 語(yǔ)法:

      • QuerySet.annotate(結(jié)果變量名=聚合函數(shù)('列'))
    • 用法步驟:

      1. 通過(guò)先用查詢(xún)結(jié)果Entry.object.value. 查找查詢(xún)要分組聚合的列
        • Entry.object.value('列1', '列2')
        • 如:
          pub_set = models.Book.objects.values('pub')
          print(books)  # <QuerySet [{'pub': '清華大學(xué)出版社'}, {'pub': '清華大學(xué)出版社'}, {'pub_hou {'pub': '機(jī)械工業(yè)出版社'}, {'pub': '清華大學(xué)出版社'}]>
          
          
      2. 通過(guò)返回結(jié)果的 QuerySet.annotate 方法分組聚合得到分組結(jié)果
        • QuerySet.annotate(名=聚合函數(shù)('列'))
        • 返回 QuerySet 結(jié)果集,內(nèi)部存儲(chǔ)結(jié)果的字典
        • 如:
          pub_count_set = pub_set.annotate(myCount=Count('pub'))
          print(pub_count_set)  # <QuerySet [{'pub': '清華大學(xué)出版社', 'myCount': 7}, {'pub': '機(jī)械工業(yè)出版社', 'myCount': 3}]>
          
      • .values('查詢(xún)列名')
    • 示例:

      • 得到哪兒個(gè)出版社共出版多少本書(shū)
      def test_annotate(request):
         - from django.db.models import Count
          from . import models
      
          # 得到所有出版社的查詢(xún)集合QuerySet
          pub_set = models.Book.objects.values('pub')
          # 根據(jù)出版社查詢(xún)分組,出版社和Count的分組聚合查詢(xún)集合
          pub_count_set = pub_set.annotate(myCount=Count('pub'))  # 返回查詢(xún)集合
          for item in pub_count_set:
              print("出版社:", item['pub'], "圖書(shū)有:", item['myCount'])
          return HttpResponse('請(qǐng)查看服務(wù)器端控制臺(tái)獲取結(jié)果')
      

F對(duì)象

  • 一個(gè)F對(duì)象代表數(shù)據(jù)庫(kù)中某個(gè)字段的信息
  • F對(duì)象通常是對(duì)數(shù)據(jù)庫(kù)中的字段值在不加載到內(nèi)存中的情況下直接在數(shù)據(jù)庫(kù)服務(wù)器端進(jìn)行操作
  • F對(duì)象在 數(shù)據(jù)包 django.db.models 中.使用時(shí)需要通過(guò)如下語(yǔ)句進(jìn)行加載
    • from django.db.models import F
  1. 作用:

    • 用于類(lèi)屬性(字段)之間的比較。
    • 當(dāng)同時(shí)對(duì)數(shù)據(jù)庫(kù)中兩個(gè)字段的值進(jìn)行比較獲取 QuerySet 數(shù)據(jù)集時(shí),可以便用F對(duì)象
  2. 說(shuō)明:

    • 一個(gè) F()對(duì)象代表了一個(gè)model的字段的值
  3. 使用它就可以直接參考model的field和執(zhí)行數(shù)據(jù)庫(kù)操作而不用再把它們(model field)查詢(xún)出來(lái)放到python內(nèi)存中。

  4. 語(yǔ)法:

    from django.db.models import F
    F('列名')
    
  5. 示例1

    • 更新Book實(shí)例中所有的制場(chǎng)價(jià)漲10元
    models.Book.objects.all().update(market_price=F('market_price')+10)
    # 以下做法好于如下代碼
    books = models.Book.objects.all()
    for book in books:
        book.update(market_price=book.marget_price+10)
        book.save()
    
  6. 示例2

    • 對(duì)數(shù)據(jù)庫(kù)中兩個(gè)字段的值進(jìn)行比較,列出哪兒些書(shū)的零售價(jià)高于定價(jià)?
    from django.db.models import F
    from bookstore import models
    books = models.Book.objects.filter(market_price__gt=F('price'))
    for book in books:
        print(book.title, '定價(jià):', book.price, '現(xiàn)價(jià):', book.market_price)
    

Q對(duì)象 - Q()

  • 當(dāng)在獲取查詢(xún)結(jié)果集 使用復(fù)雜的邏輯或 | 、 邏輯非 ~ 等操作時(shí)可以借助于 Q對(duì)象進(jìn)行操作
  • 如: 想找出定價(jià)低于20元 或 清華大學(xué)出版社的全部書(shū),可以寫(xiě)成
    models.Book.objects.filter(Q(price__lt=20)|Q(pub="清華大學(xué)出版社"))
    
  • Q對(duì)象在 數(shù)據(jù)包 django.db.models 中。需要先導(dǎo)入再使用
    • from django.db.models import F
  1. 作用
    • 在條件中用來(lái)實(shí)現(xiàn)除 and(&) 以外的 or(|) 或 not(~) 操作
  2. 運(yùn)算符:
    • & 與操作
    • | 或操作
    • ? 非操作
  3. 語(yǔ)法
    from django.db.models import Q
    Q(條件1)|Q(條件2)  # 條件1成立或條件2成立
    Q(條件1)&Q(條件2)  # 條件1和條件2同時(shí)成立
    Q(條件1)&~Q(條件2)  # 條件1成立且條件2不成立
    ...
    
  4. 示例
    from django.db.models import Q
    # 查找清華大學(xué)出版社的書(shū)或價(jià)格低于50的書(shū)
    models.Book.objects.filter(Q(market_price__lt=50) | Q(pub_house='清華大學(xué)出版社'))
    # 查找不是機(jī)械工業(yè)出版社的書(shū)且價(jià)格低于50的書(shū)
    models.Book.objects.filter(Q(market_price__lt=50) & ~Q(pub_house='機(jī)械工業(yè)出版社'))
    

原生的數(shù)據(jù)庫(kù)操作方法

使用Entry.objects.raw()進(jìn)行 數(shù)據(jù)庫(kù)查詢(xún)操作查詢(xún)
  • 在django中,可以使用模型管理器的raw方法來(lái)執(zhí)行select語(yǔ)句進(jìn)行數(shù)據(jù)查詢(xún)
  1. 語(yǔ)法:
    • Entry.objects.raw(sql語(yǔ)句)
  2. 用法
    • Entry.objects.raw('sql語(yǔ)句')
  3. 返回值:
    • QuerySet 集合對(duì)象
  4. 示例
    books = models.Book.objects.raw('select * from bookstore_book')
    
    for book in books:
        print(book)
    
使用django中的游標(biāo)cursor對(duì)數(shù)據(jù)庫(kù)進(jìn)行 增刪改操作
  • 在Django中可以使用 如UPDATE,DELETE等SQL語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。

  • 在DJaogo中使用上述非查詢(xún)語(yǔ)句必須使用游標(biāo)進(jìn)行操作

  • 使用步驟:

    1. 導(dǎo)入cursor所在的包
      • Django中的游標(biāo)cursor定義在 django.db.connection包中,使用前需要先導(dǎo)入
      • 如:
        • from django.db import connection
    2. 用創(chuàng)建cursor類(lèi)的構(gòu)造函數(shù)創(chuàng)建cursor對(duì)象,再使用cursor對(duì)象,為保證在出現(xiàn)異常時(shí)能釋放cursor資源,通常使用with語(yǔ)句進(jìn)行創(chuàng)建操作
      • 如:
        from django.db import connection
        with connection.cursor() as cur:
            cur.execute('執(zhí)行SQL語(yǔ)句')
        
    • 示例
      # 用SQL語(yǔ)句將id 為 10的 書(shū)的出版社改為 "XXX出版社"
      from django.db import connection
      with connection.cursor() as cur: 
          cur.execute('update bookstore_book set pub_house="XXX出版社" where id=10;')
      
      with connection.cursor() as cur:
          # 刪除 id為1的一條記錄
          cur.execute('delete from bookstore_book where id=10;')
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容