Django模型層之多表操作(一)

創(chuàng)建模型

實(shí)例:我們來假定下面這些概念蹦魔,字段和關(guān)系

1、作者模型:一個(gè)作者有姓名和年齡铁追。

作者詳細(xì)模型:把作者的詳情放到詳情表季蚂,包含生日,手機(jī)號(hào)琅束,家庭住址等信息扭屁。作者詳情模型和作者模型之間是一對(duì)一的關(guān)系(one-to-one)

出版商模型:出版商有名稱,所在城市以及email涩禀。

書籍模型: 書籍有書名和出版日期料滥,一本書可能會(huì)有多個(gè)作者,一個(gè)作者也可以寫多本書艾船,所以作者和書籍的關(guān)系就是多對(duì)多的關(guān)聯(lián)關(guān)系(many-to-many);一本書只應(yīng)該由一個(gè)出版商出版葵腹,所以出版商和書籍是一對(duì)多關(guān)聯(lián)關(guān)系(one-to-many)。

Book

   id    title   price  publish    
     php     100   人民出版社  
     python  200   北京出版社   
     go      100   人民出版社  
     java    300   上海出版社  


為了存儲(chǔ)出版社的郵箱屿岂,地址践宴,在第一個(gè)表后面加字段

Book

   id    title   price  publish    email    addr    
     php     100   人民出版社   111      北京
     python  200   北京出版社 222      北京
     go      100   人民出版社   111      北京
     java    300   上海出版社   111      上海
   
這樣會(huì)有大量重復(fù)的數(shù)據(jù),浪費(fèi)空間


####################################################################################


一對(duì)多:一個(gè)出版社對(duì)應(yīng)多本書(關(guān)聯(lián)信息建在多的一方爷怀,也就是book表中)

Book

   id    title   price     publish_id   
     php     100         1
     python  200         1
     go      100         2  
     java    300         1


Publish

    id    name       email    addr    
   人民出版社   111      北京       
   上海出版社   222      上海



總結(jié):一旦確定表關(guān)系是一對(duì)多:在多對(duì)應(yīng)的表中創(chuàng)建關(guān)聯(lián)字段(在多的表里創(chuàng)建關(guān)聯(lián)字段)  浴井,publish_id


查詢python這本書的出版社的郵箱(子查詢)

   select publish_id from Book where title=“python”
   select email from Publish where id=1


####################################################################################


多對(duì)多:一本書有多個(gè)作者,一個(gè)作者出多本書

Book

   id    title   price     publish_id    
     php     100         1               
     python  200         1
     go      100         2  
     java    300         1



Author
         id  name  age   addr
   alex  34   beijing
   egon  55   nanjing



Book2Author

    id    book_id  author_id
      2         1
      2         2
      3         2

總結(jié):一旦確定表關(guān)系是多對(duì)多:創(chuàng)建第三張關(guān)系表(創(chuàng)建中間表霉撵,中間表就三個(gè)字段磺浙,自己的id,書籍id和作者id) :
          
          id      book_id   author_id


# alex出版過的書籍名稱(子查詢)

select id from Author where name='Alex'

select book_id from Book2Author where  author_id=1

select title from Book where id =book_id

####################################################################################


一對(duì)一:對(duì)作者詳細(xì)信息的擴(kuò)展(作者表和作者詳情表)

Author
         id  name  age     ad_id(UNIQUE) 
   alex  34       1     
   egon  55       2     


AuthorDetail

   id    addr      gender    tel   gf_name   author_id(UNIQUE)
  beijing    male      110   小花           1
  nanjing    male      911   杠娘           2


總結(jié): 一旦確定是一對(duì)一的關(guān)系:在兩張表中的任意一張表中建立關(guān)聯(lián)字段+Unique






====================================


Publish  
Book
Author
AuthorDetail
Book2Author



CREATE TABLE publish(
                id INT PRIMARY KEY auto_increment ,
                name VARCHAR (20)
              );


CREATE TABLE book(
                id INT PRIMARY KEY auto_increment ,
                title VARCHAR (20),
                price DECIMAL (8,2),
                pub_date DATE ,
                publish_id INT ,
                FOREIGN KEY (publish_id) REFERENCES publish(id)
              );


CREATE TABLE authordetail(
                id INT PRIMARY KEY auto_increment ,
                tel VARCHAR (20)
              );

CREATE TABLE author(
                id INT PRIMARY KEY auto_increment ,
                name VARCHAR (20),
                age INT,
                authordetail_id INT UNIQUE ,
                FOREIGN KEY (authordetail_id) REFERENCES authordetail(id)
              );



CREATE  TABLE book2author(
       id INT PRIMARY KEY auto_increment ,
       book_id INT ,
       author_id INT ,
       FOREIGN KEY (book_id) REFERENCES book(id),
       FOREIGN KEY (author_id) REFERENCES author(id)
)

分析如下

注意:關(guān)聯(lián)字段與外鍵約束沒有必然的聯(lián)系(建管理字段是為了進(jìn)行查詢徒坡,建約束是為了不出現(xiàn)臟數(shù)據(jù))

2撕氧、在Models創(chuàng)建如下模型

class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField()
    # 閱讀數(shù)
    # reat_num=models.IntegerField(default=0)
    # 評(píng)論數(shù)
    # commit_num=models.IntegerField(default=0)

    publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)
    authors=models.ManyToManyField(to='Author')
    def __str__(self):
        return self.name


class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE)


class AuthorDatail(models.Model):
    nid = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)


class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

生成的表如下:


image.png

注意事項(xiàng):

  • 表的名稱myapp_modelName,是根據(jù) 模型中的元數(shù)據(jù)自動(dòng)生成的喇完,也可以覆寫為別的名稱

  • id字段是自動(dòng)添加的

  • 對(duì)于外鍵字段伦泥,Django 會(huì)在字段名上添加"_id" 來創(chuàng)建數(shù)據(jù)庫中的列名
    這個(gè)例子中的CREATE TABLE SQL 語句使用PostgreSQL 語法格式,要注意的是Django 會(huì)根據(jù)settings 中指定的數(shù)據(jù)庫類型來使用相應(yīng)的SQL 語句。

  • 定義好模型之后不脯,你需要告訴Django 使用這些模型府怯。你要做的就是修改配置文件中的INSTALL_APPSZ中設(shè)置,在其中添加models.py所在應(yīng)用的名稱防楷。
    外鍵字段 ForeignKey 有一個(gè) null=True 的設(shè)置(它允許外鍵接受空值 NULL)牺丙,你可以賦給它空值 None 。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末复局,一起剝皮案震驚了整個(gè)濱河市冲簿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌亿昏,老刑警劉巖峦剔,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異角钩,居然都是意外死亡吝沫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門递礼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惨险,“玉大人,你說我怎么就攤上這事宰衙。” “怎么了睹欲?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵供炼,是天一觀的道長。 經(jīng)常有香客問我窘疮,道長袋哼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任闸衫,我火速辦了婚禮涛贯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔚出。我一直安慰自己弟翘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布骄酗。 她就那樣靜靜地躺著稀余,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趋翻。 梳的紋絲不亂的頭發(fā)上睛琳,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼师骗。 笑死历等,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辟癌。 我是一名探鬼主播寒屯,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼愿待!你這毒婦竟也來了浩螺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤仍侥,失蹤者是張志新(化名)和其女友劉穎要出,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體农渊,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡患蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砸紊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传于。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖醉顽,靈堂內(nèi)的尸體忽然破棺而出沼溜,到底是詐尸還是另有隱情,我是刑警寧澤游添,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布系草,位于F島的核電站,受9級(jí)特大地震影響唆涝,放射性物質(zhì)發(fā)生泄漏找都。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一廊酣、第九天 我趴在偏房一處隱蔽的房頂上張望能耻。 院中可真熱鬧,春花似錦亡驰、人聲如沸晓猛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鞍帝。三九已至,卻和暖如春煞茫,著一層夾襖步出監(jiān)牢的瞬間帕涌,已是汗流浹背摄凡。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚓曼,地道東北人亲澡。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像纫版,于是被迫代替她去往敵國和親床绪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容