基表 多表關係及子序列化

2022-08-24 23:00:14 字數 2277 閱讀 2611

目錄斷關聯表關係:

表關係:

外來鍵字段屬性:

子序列化:

class book(basemodel):

name = models.charfield(max_length=64)

price = models.decimalfield(max_digits=10, decimal_places=2)

publish = models.foreignkey(to='publish', related_name='books', db_constraint=false, on_delete=models.do_nothing, null=true)

authors = models.manytomanyfield(to='author', related_name='books', db_constraint=false)

def __str__(self):

return self.name

class publish(basemodel):

name = models.charfield(max_length=64)

address = models.charfield(max_length=64)

class author(basemodel):

name = models.charfield(max_length=64)

class authordetail(basemodel):

mobile = models.charfield(max_length=64)

author = models.onetoonefield(to=author, related_name='detail', db_constraint=false, on_delete=models.cascade)

在基表中對應的類中寫下面兩行**,其他錶類繼承基錶類後資料庫遷移才有效。如果不寫這兩行**,直接執行資料庫遷移命令,繼承基錶類的其他表中不會生成應有的字段。

class meta:

abstract = true

1、不會影響連表查詢操作效率

2、會提公升連表增刪改的操作效率

3、易於後期資料庫表的重構

1、資料庫本身沒有連表檢測,容易出現髒資料,需要通過嚴格的邏輯避免髒資料的引數(必要時管理髒資料)

舉例:a依賴b,先插入a記錄,該記錄對應的b記錄沒產生,在沒有關聯的情況下,該操作可以實現,但是資料就是髒資料。接著再將b資料新增,髒資料就得到處理了,返過來先操作b後操作a,更滿足邏輯思維,一樣可以執行。通過邏輯將ab表進行連表查詢,不會有任何異常。

1、book 和 publish 一對多:外來鍵在多的一方 book中

2、book 和 author 多對多: 外來鍵在查詢頻率高的一方 book

3、author 和 authordetail 一對一: 外來鍵在查詢頻率低的一方更合理

1、related_name 在外鍵中設定外來鍵反向查詢的欄位名:正向找欄位名,反向找related_nema值。

2、on_delete在外鍵中必須設定,表示級聯關係,在django 1.x下,系統預設提供(值為models.cascade), django 2.x下,必須手動明確。

​ cascade: 預設值,級聯。

​ 例子:作者沒,詳情一定沒,存在沒意義。

​ do_nothing:外來鍵不會被級聯,假設a表依賴b表,b記錄刪除,a表的外來鍵字段不做任何處理。

​ 例子:作者沒,書還是作者寫的;出版社沒,書還是該出版社出版的。

​ set_default:假設a表依賴b表,b記錄刪除,a表的外來鍵字段設定為default屬性設定的值,所以必須配合default屬性使用。

​ 例子:部門沒,部門員工進入待定部門(注:關聯部門表外來鍵可以為空)。

​ set_null:假設a表依賴b表,b記錄刪除,a表的外來鍵字段設定為null,所以必須配合null=true屬性使用。

​ 注:多對多字段不能設定on_delete級聯關係,預設為級聯,如果要處理級聯關係,需要手動明確關係表,處理關係表中的多個外來鍵

3、db_constraint在外鍵中控制表關聯,預設為true表示關聯,設定false表示斷開關聯(注:該欄位只能給foreignkey進行設定)。

1、只能在序列化中使用,

2、欄位名必須是外來鍵字段,

3、在外鍵關聯資料時多條時,

4、需要明確many=true,

5、是單向操作

tips:只用來展示的長整型數字可以用charfield型別,如**號碼,身份證號。因為它們不會用於計算。

Django 序列化資料之多表資料序列化

1.將查詢後的多張表的資料做序列化操作 2.為什麼要做三張表的序列化操作,因為三張表的字段有些相同有些不同 3.將三張表序列化後的資料進行合併 4.之後將合併後的序列化操作實現分頁查詢操作 data group1qeryset models.group1.objects.all group2qery...

Serializer序列化和反序列化的基礎使用方法

序列化定義 序列化器的作用 封裝了序列化操作 封裝了反序列化操作 反序列化使用 序列化流程 模型類物件 字典 json格式字串 1 獲取目標資料 乙個或者多個模型類物件 單一目標資料 book bookinfo.objects.get pk 2 多個目標資料 books bookinfo.objec...

C DataSet序列化及反序列化

反序列化壓縮的dataset static dataset datasetdeserializedecompress string filepath binaryformatter sfformatter new binaryformatter 定義binaryformatter以反序列化datas...