Django Model設計詳解

Django Model 設計

Django Model設計是Django五項基礎核心設計之一(Model設計,URL配置,View編寫,Template設計,From使用),也是MVC模式中重要的環節。

如果圖片無法訪問,大家可以移步GitHub Django Model 設計查看

Model是數據模型,并不是數據庫,它描述了數據的構成和他們之間的邏輯關系,在Django中,Model設計實質上就是一個類,所以我們可以直接站在類的角度來看Model,這樣可以盡量避免一些晦澀的概念影響理解。

下面是python中一個基本類的構成

class ClassName(object):# 屬性(類屬性)Attribute = ""# 方法def Method():pass

根據上面python中的類,我們依次研究Django Model

  • 基類:定義Django Model的類必須繼承自models.Model
  • 類名:在Django Model設計中,類名會被當作是這個數據模型的名稱。
  • 類屬性:Django Model設計過程中,類屬性有兩方面的作用,一是申明字段,二是申明關系(一對多,多對多,一對一)
  • 方法:由于是派生類,所以我們不需要自己定義很多方法,Model基類已經做的足夠完善了,只是在有必要的時候我們需要重寫一些方法,如常見的__str__
  • 內嵌類Meta:Django Model設計過程中,內嵌類Meta用來定義元數據,所謂元數據就是不是字段的任何數據,比如定義排序規則等

下面依次介紹字段,關系,Meta

1.字段 Field

都說官方文檔才是學習一門語言最好的教程,訪問官方文檔

1.1 字段類型(Field types)

字面意思,用來申明該字段的類型,比如常見的字符,數字,日期,郵箱等待,下面列舉常見的字段類型

AutoField(主鍵)

這一個字段一般不需要我們手動定義,主要用于ID的自動遞增,Django會默認為我們創建一個id

# 每一個Model Django都會為我們添加這個字段
id = models.AutoField(primary_key=True)

如果想把自己定義的字段設置為主鍵,需要添加參數primary_key,這時(顯式設置主鍵)Django將不會為我們添加ID字段

與之類似還有一個BigAutoField,它支持更大的范圍,最大到9223372036854775807(九百二十億億)足夠絕大多數的使用

IntegerField(整數字段)

字面意思,用來保存整數的字段,支持 -2147483648 到 2147483647 的數字

同樣與之類似有BigIntegerField 支持-9223372036854775808 到 9223372036854775807 的數字

類似還有FloatField,支持浮點數

BooleanField(布爾字段)

用來存儲布爾值,與之類似的還有NullBooleanField,NullBooleanField相當于BooleanField(null=true),不過在Django 2.1 之后不建議使用后者,應為它有可能在未來版本被棄用

CharField(字符字段)

這應該是最常用的一個字段了吧,用于少量的字符串的儲存(大量字符串請使用TextField)這個字段有一個必須參數max_length用來申明允許儲存的最大長度

 class CharField(Field):description = _("String (up to %(max_length)s)")# ...def _check_max_length_attribute(self, **kwargs):if self.max_length is None:return [checks.Error("CharFields must define a 'max_length' attribute.",obj=self,id='fields.E120',)]

根據源碼,我們可以發現如果不指定max_length會直接報"CharFields must define a ‘max_length’ attribute."

DateField(時間日期字段)

該字段有兩個常用參數 auto_now 和 auto_now_add

  • auto_now :指定這個參數,可以在每次調用save()時將當前時間作為字段的值(會覆蓋默認值或之前的值),但使用QuerySet.update()等方法不會跟新值
  • auto_now_add : 在初始化會以當前時間戳作為值給字段賦值,不管你有沒有定義默認值,定義了也會被覆蓋
  • 區別:使用auto_now會在每次save()時修改字段值,而auto_now_add只是在首次創建對象時才會把當前時間給字段。
  • 如果你想能夠修改這個字段的值,請使用default=date.today需要引入from datetime.date.today()
  • auto_now,auto_now_add與default是互斥的,任何一種組合都會出錯
  • 將auto_now或auto_now_add設置為True的結果與editable = False和blank = True的效果一樣

與DateField類似的還有DateTimeField

  • 如果使用DateTimeField想要修改字段的值,需要使用default=timezone.now 同樣需要引入from django.utils.timezone.now()
  • 另外還有TimeField,用來表示時間,接受的參數與DateField一樣

[外鏈圖片轉存失敗(img-w7TfUVCo-1567244122546)(…/image/DjangoModel_01.png)]

EmailField

實質上是CharField,不過使用EmailValidator檢查了字符串是否是有效電子郵件地址而已,默認max_length=254

TextField

實質上也是一個CharField,是一個比較大的文本字段

FileField

class FileField(upload_to=None, max_length=100, **options)

正如文檔所說,這是一個文件上傳字段,有兩個可選參數upload_to和max_length,后者默認100

upload_to

見名知意,upload_to用來申明上傳目錄,如果給定一個字符串類型初值,Django會在他后面添加時間(就是以上傳時間分類文件),用戶上傳文件一般保存到media目錄中,media目錄路徑需要在setting.py里定義

MEDIA_ROOT = os.path.join(BASE_DIR, "media")

這個media文件夾如果我們沒有建立,保存文件時Django會自動創建

class MyModel(models.Model):# file will be uploaded to MEDIA_ROOT/uploadsupload = models.FileField(upload_to='uploads/')# or...# file will be saved to MEDIA_ROOT/uploads/2015/01/30upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

如果需要動態存儲文件,如按用戶存儲,可以把一個函數的返回值作為upload_to的值,這個函數必須接受兩個參數:instance(主鍵,傳給當前文件的唯一實例)和filename(文件名),如:

def user_directory_path(instance, filename):# file will be uploaded to MEDIA_ROOT/user_<id>/<filename>return 'user_{0}/{1}'.format(instance.user.id, filename)class MyModel(models.Model):upload = models.FileField(upload_to=user_directory_path)

這里看著有點復雜,其實也不難,instance是當前FileField的模型實例的模型實例,也就是我們定義的字段,上面的示例是的user是和User表對應的,當然也可以不是user,比如:

def user_directory_path(instance, filename):# 我沒有用user,而是自己定義了一個name字段return 'user_{0}/{1}'.format(instance.name, filename)class Diary(models.Model):name = models.CharField(max_length=10)creat_time = models.DateTimeField(auto_now_add=True)time = models.TimeField(auto_now=True)upload = models.FileField(upload_to=user_directory_path,default="")class Meta:verbose_name = "Diary"verbose_name_plural = "Diarys"

[外鏈圖片轉存失敗(img-SGnfpXgs-1567244122548)(…/image/DjangoModel_02.png)]

保存之后就可以看見項目根目錄下的文件了

[外鏈圖片轉存失敗(img-KUPPj7yc-1567244122552)(…/image/DjangoModel_03.png)]

使用時間也是一樣的

class Diary(models.Model):name = models.CharField(max_length=10)creat_time = models.DateTimeField(auto_now_add=True)time = models.TimeField(auto_now=True)# upload = models.FileField(upload_to=user_directory_path,default="")upload = models.FileField(upload_to='user_123/%Y/%m/%d/',default="")class Meta:verbose_name = "Diary"verbose_name_plural = "Diarys"def __str__(self):return self.name

[外鏈圖片轉存失敗(img-oPc8recT-1567244122558)(…/image/DjangoModel_04.png)]

FileField 和 FieldFile

當您訪問model上的FileField時,會獲得一個FieldFile的實例作為訪問基礎文件的代理。它是繼承自python的File的,有read(),write()等,還自己封裝了一些方法,如url,name等,看官網

ImageField

class ImageField(FileField):attr_class = ImageFieldFiledescriptor_class = ImageFileDescriptordescription = _("Image")def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, **kwargs):self.width_field, self.height_field = width_field, height_fieldsuper().__init__(verbose_name, name, **kwargs)

由源碼可以看到,ImageField是繼承自FileField的一個字段,除了FileField中的特殊屬性外,它額外添加了width_field, height_field兩個屬性用來描述圖片大小,它會檢查一個文件是否是圖片,其他用法與FileField一樣。

其他

除了上面常見的這些,還有一些字段,諸如用作URL的URLField,還有不同大小的IntField,如PositiveSmallIntegerFieldPositiveIntegerFieldSmallIntegerField,用作IP地址的GenericIPAddressField等待,此外,你也可以自定義字段,看文檔就好。

1.2 參數總結

之前遇到很多參數,如max_length,default等,這里再做總結

null

如果為True,Django將在數據庫中將空值存儲為NULL。 默認值為False。

避免在基于字符串的字段(如CharField和TextField)上使用null。 如果基于字符串的字段具有null = True,則表示它具有“無數據”的兩個可能值:NULL和空字符串。 在大多數情況下,為“無數據”提供兩個可能的值是多余的; Django約定是使用空字符串,而不是NULL。

blank

如果為真,則允許該字段為空。默認是假的。注意,這與null不同。null純粹與數據庫相關,而blank則與驗證相關。如果字段為blank=True,表單驗證將允許輸入空值。如果字段為空=False,則需要該字段。

choices

為字段提供選項,首先他的值應該是一個可迭代對象,如列表或元組,其次每一項中都應該包含兩個元素,第一個是要存儲到數據庫中的真實值,第二個是展示給人的值,比如

class Diary(models.Model):SEX_CHOICES = (('boy', 'BOY'),('girl', 'GIRL'),('else', 'ELSE'))sex = models.CharField(max_length=10,choices=SEX_CHOICES,default="")

這個Model展示在admin頁面是這樣的,請忽略其他字段,那是之前寫的

[外鏈圖片轉存失敗(img-mRp1xKaa-1567244122563)(…/image/DjangoModel_05.png)]

在隨便存儲一個值后,在MySQL數據庫中可以看到是這樣的(最后一項)

[外鏈圖片轉存失敗(img-0JWk72Nk-1567244122565)(…/image/DjangoModel_06.png)]

展示給我們的是后面大寫的,而存儲在數據庫中的則是前面小寫的

除此之外,如果Model中有多個字段需要選項,可以把這些選項分類放在同一個可迭代對象中,如

MEDIA_CHOICES = (('Audio', (('vinyl', 'Vinyl'),('cd', 'CD'),)),('Video', (('vhs', 'VHS Tape'),('dvd', 'DVD'),)),('unknown', 'Unknown'),
)

default

指定默認值,可以是默認字符串也可以是函數返回值

db_column

用于此字段的數據庫列的名稱。 如果沒有給出,Django將使用該字段的名稱。

db_index

如果為True,則將為此字段創建數據庫索引。

db_tablespace

如果此字段已編制索引,則用于此字段索引的數據庫表空間的名稱。 默認值為項目的DEFAULT_INDEX_TABLESPACE設置(如果已設置)或模型的db_tablespace(如果有)。 如果后端不支持索引的表空間,則忽略此選項。

editable

如果為False,則該字段不會顯示在admin或任何其他ModelForm中。 在模型驗證期間也會跳過它們。 默認為True。

error_messages

error_messages參數允許您覆蓋字段將引發的默認消息。傳入一個字典,其中的關鍵字與您要覆蓋的錯誤消息相匹配。

在 表單字段 級別或者 表單 Meta 級別定義的錯誤信息優先級總是高于在 模型字段 級別定義的。

在 模型字段 上定義的錯誤信息只有在 模型驗證 步驟引發 ValidationError 時才會使用,并且沒有在表單級定義相應的錯誤信息。

您可以通過添加 NON_FIELD_ERRORS 鍵到 ModelForm 內部的 Meta 類的 error_messages 中來覆蓋模型驗證引發的 NON_FIELD_ERRORS 錯誤信息。

help_text

使用表單小部件顯示的額外“幫助”文本。 即使您的字段未在表單上使用,它也對文檔很有用。

請注意,此值不會在自動生成的表單中進行HTML轉義。 如果您愿意,這可以讓您在help_text中包含HTML。 例如:

help_text="Please use the following format: <em>YYYY-MM-DD</em>."

primary_key

如果為True,則此字段將作為Model的主鍵

unique

如果需要設置該字段值唯一,需要把unique設置為True,如果嘗試保存一個已經存在的值,將會引發django.db.IntegrityError異常,我們需要捕捉這個異常,用于諸如用戶名等方面

總結

常用的主要這幾個

  • blank:允許為空
  • choices:提供選擇
  • default:提供默認值
  • db_column:提供數據表列名
  • unique:設置是否唯一

2 關系字段

關系也是一種字段,只是這個字段的值是別的某個或多個Model,只有三種關系字段 ForeignKey,ManyToManyField 和 OneToOneField

2.1 ForeignKey

這是一種多對一的關系。 需要兩個參數:要關聯的模型類和on_delete選項。

如果要創建遞歸關系 ( 與自身具有多對一關系的對象 )請使用

models.ForeignKey('self',on_delete = models.CASCADE)。

如果需要在尚未定義的模型上創建關系,可以使用模型的名稱,而不是模型對象本身:

class Diary(models.Model):Ordinary_user = models.ForeignKey('Demo2',on_delete=models.CASCADE,default="")class Demo2(models.Model):email: str = models.EmailField(blank=True,db_column="郵箱",default="")Tel_Num = models.CharField(max_length=20,blank=True,db_column="聯系電話",default="")address: str = models.CharField(max_length=100,blank=True,db_column="住址",default="")ID_card = models.CharField(max_length=20, db_column="身份證號",default="")

這樣,我們建立了兩張表,Diary表中Ordinary_user字段與Demo2是一個多對一的關系,先看一下兩張表在MySQL數據庫中的樣子

先是diary表,同樣請忽略其他字段,表名是app名_類名

[外鏈圖片轉存失敗(img-j7xvKUZD-1567244122568)(…/image/DjangoModel_07.png)]

其次是Demo2表

[外鏈圖片轉存失敗(img-uHS783Pt-1567244122571)(…/image/DjangoModel_08.png)]

發現Django把ForeignKey字段的列名命名為目標Model名_id這里之所以是_id是應為id是這個表的主鍵,而里面存儲的也是對應的id序號,就是通過保存主鍵的方式實現一對多的。

然后再看一下再admin界面的樣子把

[外鏈圖片轉存失敗(img-oGREHt43-1567244122573)(…/image/DjangoModel_09.png)]

點加號會打開一個新窗口讓你添加Dome的數據,應該挺方便

[外鏈圖片轉存失敗(img-BcLglQBH-1567244122575)(…/image/DjangoModel_10.png)]

on_delete

這是必選參數,當刪除ForeignKey引用的對象時,Django將模擬on_delete參數指定的SQL約束的行為。總共有六種選擇
CASCADE,PROTECT,SET_NULL,SET_DEFAULT,SET(),DO_NOTHING

  • CASCADE:級聯刪除。 Django模擬SQL約束ON DELETE CASCADE的行為,并刪除包含ForeignKey的對象。
  • PROTECT:通過引發ProtectedError(django.db.IntegrityError的子類)來防止刪除引用的對象。
  • SET_NULL:將ForeignKey設置為null; 這只有在null為True時才有可能
  • SET_DEFAULT:將ForeignKey設置為其默認值; 必須設置ForeignKey的默認值。
  • SET():將ForeignKey設置為傳遞給SET()的值,或者如果傳入了回調函數,則調用它的結果。 在大多數情況下,為了避免在導入models.py時執行查詢,必須傳遞一個回調函數。
  • DO_NOTHING:不采取行動。 如果數據庫后端強制實施參照完整性,則除非您手動將SQL ON DELETE約束添加到數據庫字段,否則將導致IntegrityError。

2.2 ManyToManyField

多對多的關系。 只有一個必須參數:與模型相關的類,它與ForeignKey的工作方式完全相同,包括遞歸和惰性關系。

2.2.1 參數

(1).symmetrical

只有在和自己建立多對多關系時才有效,為true時建立的是對稱關系,反之為False建立非對稱關系,默認為True,例如:

class Demo2(models.Model):friends = models.ManyToManyField("self",symmetrical=False,)

默認為true的情況下,如果建立A時指定friend為B,C,那么在B,C中,A也會被申明為自己的朋友,反之則不會

(2).through

Django將自動生成一個表來管理多對多關系。 但是,如果要手動指定中間表,可以使用through選項指定表示要使用的中間表的Django模型

此選項最常見的用途是,您希望將額外數據與多對多關系相關聯。

如果未指定顯式直通模型,則仍可使用隱式直通模型類來直接訪問為保持關聯而創建的表。 它有三個字段來鏈接模型。

如果源模型和目標模型不同,表中的字段如下:

  • id: 主鍵
  • <containing_model>_id: 申明多對多關系的模型id
  • <other_model>_id: 指向的模型id

[外鏈圖片轉存失敗(img-A9IklSnF-1567244122579)(…/image/DjangoModel_11.png)]

如果原模型與目標Model相同(自己與自己建立多對多關系),表中的字段如下:

  • id:關系的主鍵。
  • from_ <model> _id:源實例
  • to_ <model> _id:目標模型實例

[外鏈圖片轉存失敗(img-pRlQ5pOm-1567244122581)(…/image/DjangoModel_12.png)]

(3).through_fields

僅在指定自定義中間模型時使用。 Django通常會確定要使用哪個中間模型字段,以便自動建立多對多關系。 但是,請考慮以下情況:

from django.db import modelsclass Person(models.Model):name = models.CharField(max_length=50)class Group(models.Model):name = models.CharField(max_length=128)members = models.ManyToManyField(Person,through='Membership',through_fields=('group', 'person'),)class Membership(models.Model):group = models.ForeignKey(Group, on_delete=models.CASCADE)person = models.ForeignKey(Person, on_delete=models.CASCADE)inviter = models.ForeignKey(Person,on_delete=models.CASCADE,related_name="membership_invites",)invite_reason = models.CharField(max_length=64)

Membership有兩個外鍵(person和inviter),這使得關系模糊不清,Django無法知道使用哪一個。 在這種情況下,您必須使用through_fields明確指定Django應使用哪些外鍵,如上例所示。

through_fields接受2元組(‘field1’,‘field2’),其中field1是定義ManyToManyField的模型的外鍵名稱(在本例中為group),field2是外鍵的名稱。 目標模型(本例中的person)。

如果中間模型上有多個外鍵到參與多對多關系的任何(甚至兩個)模型,則必須指定through_fields。 這也適用于使用中間模型時的遞歸關系,并且模型有兩個以上的外鍵,或者您想要明確指定Django應該使用哪兩個。

使用中間模型的遞歸關系總是被定義為非對稱的 - 也就是說,symmetrical=False 因此,存在“源”和“目標”的概念。 在這種情況下,'field1’將被視為關系的“源”,'field2’將被視為“目標”。

2.3 OneToOneField

一對一的關系。 從概念上講,這類似于具有unique = True的ForeignKey,但關系的“反向”一側將直接返回單個對象。

這作為模型的主鍵是最有用的,它以某種方式“擴展”另一個模型; 例如,通過從子模型向父模型添加隱式一對一關系來實現多表繼承。

需要一個位置參數:與模型相關的類。 這與ForeignKey完全相同,包括有關遞歸和惰性關系的所有選項。

如果沒有為OneToOneField指定related_name參數,Django將使用當前模型的小寫名稱作為默認值。

3. Meta

用來定義元數據(除字段以外的別的數據),常見的元數據:

  • app_label:如果你定義的Model不在app目錄下的models.py中,就需要指定該字段為app名稱
  • db_table:自定義數據表名,如果不指定,默認用app名_model名
  • db_tablespace:指定某些數據庫的表空間
  • ordering:指定排序集
  • verbose_name:可讀的名字
  • verbose_name_plural:Model的復數形式

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/457680.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457680.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457680.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python設置全局變量失敗_Python全局變量與global關鍵字常見錯誤解決方案

在Python的變量使用中&#xff0c;經常會遇到這樣的錯誤:local variable a referenced before assignment它的意思是&#xff1a;局部變量“a”在賦值前就被引用了。比如運行下面的代碼就會出現這樣的問題&#xff1a;a 3def Fuc():print (a)a a 1Fuc()? 但是如果把 a a …

Atititi tesseract使用總結

Atititi tesseract使用總結 消除bug&#xff0c;優化&#xff0c;重新發布。當前版本為3.02 項目下載地址為&#xff1a;http://code.google.com/p/tesseract-ocr。 Windows cmd命令行使用Tesseract-OCR引擎識別驗證碼: 1、下載安裝Tesseract-OCR引擎(3.0版本才支持中文識別) t…

Javascipt數組去重的幾種方式

方法一 function unique(arr) {var retArr [];for (var i 0; i < arr.length; i) {(retArr.indexOf(arr[i]) -1) && retArr.push(arr[i]);}return retArr; } 方法二 function unique(arr) {return arr.filter(function(item, index, array) {return array.indexO…

01_JS語法

JS語法 嚴格區分大小寫以;結尾&#xff0c;不寫瀏覽器會自動加&#xff0c;但不準確&#xff0c;且會占用瀏覽器資源自動忽略多個空格和換行 寫在哪 所有JS代碼都必須依托網頁運行 內嵌 寫在html的script標簽中 <script>// JS代碼 </script>事件 寫在某個ht…

pythonwhile循環love_python基礎之while循環及編碼

while 條件&#xff1a;循環體死循環&#xff1a;沒有終止條件(修改方法&#xff1a;1.改變條件2.使用break)break 終止當前循環contiune&#xff1a;跳出本次循環&#xff0c;繼續下次循環break和contione必須在循環體里while 條件&#xff1a;循環體else&#xff1a;結果當wh…

css頁面布局

居中布局 水平居中 父元素和子元素的寬度都未知 inline-block text-ailgn .child{display:inline-block;} .parent{text-align:center;} 優點&#xff1a;兼容性好 缺點&#xff1a;子元素文本繼承了text-align屬性&#xff0c;子元素要額外加text-align:left; table ma…

02_JS變量

JS變量 字面量 常量&#xff0c;不可變量 變量 變量用 var 變量名聲明 命名 變量命名以數字字母下劃線和$組成&#xff0c;不能以數字開頭&#xff0c;還可以是utf-8的任意字符&#xff0c;包括中文&#xff0c;一般采用駝峰命名法 常用的幾個函數 alert():瀏覽器彈窗d…

Rotate String

Given a string and an offset, rotate string by offset. (rotate from left to right) Example Given "abcdefg". offset0 > "abcdefg" offset1 > "gabcdef" offset2 > "fgabcde" offset3 > "efgabcd"分析&am…

音視頻播放、錄音、拍照

音頻 在iOS中音頻播放從形式上可以分為音效播放和音樂播放。前者主要指的是一些短音頻播放&#xff0c;通常作為點綴音頻&#xff0c;對于這類音頻不需要進行進度、循環等控制。后者指的是一些較長的音頻&#xff0c;通常是主音頻&#xff0c;對于這些音頻的播放通常需要進行精…

python 遞歸函數與循環的區別_提升Python效率之使用循環機制代替遞歸函數

斐波那契數列當年&#xff0c;典型的遞歸題目&#xff0c;斐波那契數列還記得嗎&#xff1f;def fib(n):if n1 or n2:return 1else:return fib(n-1)fib(n-2)當然, 為了程序健壯性&#xff0c;加上try...except...def fib(n):if isinstance(n, int):print(兄弟,輸入正整數哈)ret…

03_JS數據類型

JS數據類型 基本數據類型 String 字符串類型&#xff0c;申明時用單引號或雙引號引起來&#xff0c;兩種引號不可嵌套&#xff0c;不可混用 Number 數值型&#xff0c;有兩個特殊的數字 Infint:無窮大NaN&#xff1a;非數值型數字&#xff0c;不與任何類型相等 Boolean …

7.5

姓名 崔巍 時間 2016年7月5日 學習內容 最后一次確定同步控制力度等實現細節。 學習了Visual Studio C#軟件測試方面的工具。鞏固了等價類黑盒測試方法的相關理論&#xff0c;并且學習了集成測試、回歸測試的相關內容&#xff0c;并進行了測試。 集成測試&#xff0c;…

python scratch ev3_如何在scratch上連接樂高ev3?

樂高教育的官網有關于EV3使用Python的詳細介紹https://education.lego.com/zh-cn/support/mindstorms-ev3/python-for-ev3?education.lego.com來自網易有道Scratch是現在小朋友們最熱的編程工具&#xff0c;也是各學校和培訓機構對小學生編程的入門首選。網易有道Kada平臺是一…

04_JS運算符

JS運算符 一元運算符 -,正負號&#xff0c;對非數值類型做正負操作會先轉換成數值型&#xff0c;可以用快速進行類型轉換 邏輯運算符 且 &&&#xff0c;從左到右看&#xff0c;一旦返現值為false的表達式立刻返回false&#xff0c;全真為真或 ||&#xff0c;從左到右…

C語言 第八章 函數、指針與宏

一、函數 函數是一個包含完成一定功能的執行代碼段。我們可以把函數看成一個"黑盒子", 你只要將數據送進去就能得到結果, 而函數內部究竟是如何工作的的, 外部程序是不知道的。外部程序所知道的僅限于輸入給函數什么以及函數輸出什么。函數提供了編制程序的手段,使之…

ByteBuffer用法小結

在NIO中,數據的讀寫操作始終是與緩沖區相關聯的.讀取時信道(SocketChannel)將數據讀入緩沖區,寫入時首先要將發送的數據按順序填入緩沖區.緩沖區是定長的,基本上它只是一個列表,它的所有元素都是基本數據類型.ByteBuffer是最常用的緩沖區,它提供了讀寫其他數據類型的方法,且信道…

promise用法_Promise的秘密

寫在前面本篇文章將會帶大家從分解promise入手&#xff0c;一步步實現一個promise。但閱讀之前需要比較熟練地了解了解用法&#xff0c;結合用法看文章可能更容易理解。結構先看一下簡單的用法。const promise new Promise((resolve, reject) > {setTimeout(() > {resol…

SpringMVC視圖解析器(轉)

前言 在前一篇博客中講了SpringMVC的Controller控制器&#xff0c;在這篇博客中將接著介紹一下SpringMVC視圖解析器。當我們對SpringMVC控制的資源發起請求時&#xff0c;這些請求都會被SpringMVC的DispatcherServlet處理&#xff0c;接著Spring會分析看哪一個HandlerMapping定…

05_JS流程控制語句

JS流程控制語句 順序結構 選擇結構 if-else語句 var aprompt(); var bprompt(); var cprompt(); if(a && b || c){alert(); }else if(a || b || c){alert(); }else{alert(); }條件分支語句 var aprompt(); switch(a){case 1:alert("1");break;case 2:al…

ForkJoinPool 學習示例

在JAVA7之前&#xff0c;并行處理數據非常麻煩。第一&#xff0c;你得明確把包含數據的數據結構分成若干份。第二&#xff0c;你要將每個子部分分配給一個獨立的線程。第三&#xff0c;你要在恰當的時候對它們進行同步避免不希望的競爭條件&#xff0c;等待所有線程完成&#x…