日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Web开发-Django模型层

發(fā)布時間:2024/4/11 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Web开发-Django模型层 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Django模型層

  • 簡述
    • Django框架處理業(yè)務(wù)的邏輯一般如下(省略圖,源于網(wǎng)絡(luò),侵刪)
    • 可以看到,Django自帶了一套ORM機(jī)制,這也是Django框架的核心—“全面”,將一切能幫開發(fā)者完成的率先完成。使用Django開發(fā),只需要知道它的模型層如何使用,甚至可以不用系統(tǒng)學(xué)習(xí)過數(shù)據(jù)庫及其使用。
    • 在之前的博客,我已經(jīng)初步介紹了Django的主要組件,以及搭建了一個小站點(diǎn),在這篇,將詳細(xì)談一談Django模型層的點(diǎn)點(diǎn)滴滴。
  • 注意
    • 使用Django的ORM模型,那么建議預(yù)先創(chuàng)建相關(guān)的模型文件再進(jìn)行數(shù)據(jù)庫的遷移。
    • 每個模型類都會被映射到數(shù)據(jù)庫中的一個表,類的屬性被映射為表中的字段。(這就是ORM的核心思路)。除此之外,數(shù)據(jù)庫的主鍵、外鍵、約束都可以通過類屬性定義。
  • 基本操作
    • 模型類定義
      • 一般在該app的models.py文件中
      • 所有Django模型都必須繼承自django.db.models.Model類,否則無法完成向?qū)嶋H數(shù)據(jù)庫的遷移。
      • 一般格式
        • class ModelName(models.Model):field1 = models.XField(...)field2 = models.XField(...)...class Meta:db_table = ...other_metas = ...
      • 解析
        • 繼承自Model類
        • 通過類屬性定義模型字段,必須是某種models.XField類型
          • DjangoField類型與數(shù)據(jù)庫中數(shù)據(jù)類型對應(yīng)如下(見源碼,這里只列舉了常用的MySQL的,其余的可以到django.db.backends.DBName中base.py查看)
            • _data_types = {'AutoField': 'integer AUTO_INCREMENT','BinaryField': 'longblob','BooleanField': 'bool','CharField': 'varchar(%(max_length)s)','CommaSeparatedIntegerField': 'varchar(%(max_length)s)','DateField': 'date','DateTimeField': 'datetime','DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)','DurationField': 'bigint','FileField': 'varchar(%(max_length)s)','FilePathField': 'varchar(%(max_length)s)','FloatField': 'double precision','IntegerField': 'integer','BigIntegerField': 'bigint','IPAddressField': 'char(15)','GenericIPAddressField': 'char(39)','NullBooleanField': 'bool','OneToOneField': 'integer','PositiveIntegerField': 'integer UNSIGNED','PositiveSmallIntegerField': 'smallint UNSIGNED','SlugField': 'varchar(%(max_length)s)','SmallIntegerField': 'smallint','TextField': 'longtext','TimeField': 'time','UUIDField': 'char(32)',}
          • 通過Meta子類定義元數(shù)據(jù),如數(shù)據(jù)庫表名,可讀化名稱,數(shù)據(jù)排序方式等。
            • Meta類屬性名Django預(yù)定義,不可以超過這個范圍。
              • verbose_name: 字符串表示,該模型的可讀化名稱。
              • verbose_name_plural: 字符串表示,上述名稱的復(fù)數(shù)形式。
              • abstract: True or False,標(biāo)識本類是否為抽象基類。
              • app_label: 字符串表示,定義本類所屬的應(yīng)用。
              • db_table: 字符串表示,映射的數(shù)據(jù)庫表名,不寫會默認(rèn)生成一定格式的表名(應(yīng)用名_模型名),可讀性較差。
              • db_tablespace: 字符串表示,映射的表空間名稱。表空間的概念只在某些數(shù)據(jù)庫如Oracle中存在,沒有這個概念的數(shù)據(jù)庫忽略即可。
              • default_related_name: 字符串表示,定義本模型的反向關(guān)系引用名稱,默認(rèn)與模型名一致。
              • get_latest_by:日期或者整形的模型字段,定義按照哪個字段值排列以獲得模型的開始或結(jié)束記錄。
              • managed:True or False,定義Django的manage.py命令行工具是否管理本模型,默認(rèn)為True。
              • order_with_respect_to: 定義本模型可以按照某外鍵引用的關(guān)系排序。
              • ordering:列表表示,定義本模型所有記錄的默認(rèn)排序字段,可以多個,默認(rèn)升序,降序則在字段前加負(fù)號。(ordering = [‘field1’, ‘field2’]
              • default_permissions: 元組表示, 模型操作權(quán)限,默認(rèn)為(‘a(chǎn)dd’, ‘change’, ‘delete’)
              • proxy: True or False,本模型及其子模型是否為代理模型。
              • required_db_feathers: 列表表示,定義底層數(shù)據(jù)庫所必備的特性。
              • required_db_cendor: 定義底層數(shù)據(jù)庫類型,如SQLite,MySQL。
              • unique_together: 用來設(shè)置的不重復(fù)字段組合,必須唯一。如((‘field1’, ‘field2’),)。
              • index_together: 定義聯(lián)合索引的字段,可以多個。如[[‘field1’, ‘field2’],]。
    • 普通字段
      • 常用字段
        • CharField:字符串字段
        • AutoField:自增的整型字段
        • TextField:大容量文本字段
        • DateField:日期字段
        • 具體參考源碼
      • 常用字段參數(shù)
        • null:設(shè)置該字段數(shù)據(jù)庫字段是否可以為Null
        • blank:設(shè)置字段是否可以為空,用于字段的表單驗證,即是否可以不輸入。
        • choices:設(shè)置字段的可選值,二維元組傳入,每個元組第一個值是實際存儲的值,第二個值是HTML頁面進(jìn)行選擇時顯示的值。
        • default:設(shè)置默認(rèn)值。
        • help_text:HTML頁面輸入控件的幫助字符串。
        • primary_key:設(shè)置字段是否為主鍵,只可以設(shè)置一個字段,若字段類型是AutoField,那么必須設(shè)置為主鍵。
        • unique:設(shè)置是否為字段定義數(shù)據(jù)庫的唯一約束。
        • verbose_name:字段的人性化名稱。
    • 關(guān)系字段(約束表與表之間)
      • 一對一關(guān)系
        • OneToOneField
      • 一對多關(guān)系
        • ForeignKey
      • 多對多關(guān)系
        • ManyToManyField
    • 基本操作(增刪查改)
      • 創(chuàng)建模型
        • class User(models.Model):name = models.CharField(max_length=10, null=False, verbose_name="名字")age = models.IntegerField(null=False, verbose_name="年齡")class Meta:db_table = 'User'verbose_name = "用戶"def __str__(self):return self.name
      • 數(shù)據(jù)庫準(zhǔn)備遷移
        • 命令行輸入python manage.py makemigrations
        • 此時會輸出數(shù)據(jù)庫的改變(記住,app一定要加入settings.py文件中)
      • 數(shù)據(jù)庫遷移
        • 命令行輸入python manage.py migrate
        • 此時會反饋數(shù)據(jù)庫操作
        • 可以看到,數(shù)據(jù)庫表創(chuàng)建成功,因為沒有設(shè)置id這個字段,會自動補(bǔ)充并作為主鍵。
      • 增加
        • 傳統(tǒng)的save方法(對對象操作)
          • user = models.User()user.name = "名稱1"user.age = 18user.save()
        • create方法
          • models.User.objects.create(name="名稱3", age=22)
        • 數(shù)據(jù)的確加入到數(shù)據(jù)庫中
      • 刪除
        • 刪除所有
          • User.objects.all().delete()
        • 過濾刪除
          • User.objects.filter(name="名稱1").delete()
      • 查詢
        • 查詢所有
          • User.objects.all()
        • 查詢指定數(shù)據(jù)
          • User.objects.get(id=1)
        • 過濾查詢
          • User.objects.filter(age=18).distinct()
      • 修改
        • 獲得對象再修改
          • user = User.objects.get(id=1)
          • user.name="new"
          • user.save()
        • 獲得對象使用update
          • User.objects.get(id=1).update(name="new")
        • 獲得對象集合,集體修改
          • User.objects.filter(age=10).update(name="hhh")
      • 注意:django有兩種過濾器為filter和exclude,參數(shù)一致,前者返回符合條件的,后者返回不符合條件的。
  • 補(bǔ)充說明
    • 具體介紹了模型層的相關(guān)內(nèi)容
    • 本項目參考書為《Python高效開發(fā)實戰(zhàn)》劉長龍著
    • 使用到的所有重要包會列在requirements.txt文件中
    • 具體代碼可以查看我的GitHub,歡迎star或者fork

總結(jié)

以上是生活随笔為你收集整理的Web开发-Django模型层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。