<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • Django框架4:ORM高級操作-多表定義與操作-創(chuàng)新互聯(lián)

            Model關(guān)系說明:
            UserInfo:員工信息表,Dept:部門,JobLevel:級別

            專注于為中小企業(yè)提供做網(wǎng)站、網(wǎng)站制作服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)天鎮(zhèn)免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

            Django 框架4:ORM高級操作-多表定義與操作

            一、一對多關(guān)系

            1、使用ForeignKey定義,主表被關(guān)聯(lián)的字段,必須是primary_key或unique屬性

            ForeignKey,使用ForeignKey的字段查詢時是一個對象,使用.繼續(xù)查詢子表數(shù)據(jù)

            主表:to的表,子表,定義ForeignKey的表

            **注意,如果UserInfo表存在記錄,migrate的時候會報錯

            1)先把主表錄入數(shù)據(jù),再在ForeignKey里設(shè)置deafult

            2)把ForeignKey的null設(shè)置成True

            參數(shù)說明備注
            to

            主表名:必填

            可省略to

            例:

            'Group'或to=‘Group’

            to_feild

            關(guān)聯(lián)主表字段:必須是primarykey或unique

            1、省略,自動關(guān)聯(lián)主表的Primarykey

            2、指定關(guān)聯(lián)主鍵字段

            3、子表關(guān)聯(lián)字段名自動生成

            例:

            s=models.ForeignKey('Salary')

            子表自動生成s_id字段

            s:定義的ForeignKey名

            _id:固定

            related_name

            給外鍵定義外部查詢方法,替代_set,_set失效

            作為方法使用

            related_name='r'

            obj.r.filter()

            on_delete

            主表刪除數(shù)據(jù)后,子表做何操作,必填!

            CASCADE:此值設(shè)置,是級聯(lián)刪除。
            PROTECT:此值設(shè)置,是會報完整性錯誤。
            SET_NULL:此值設(shè)置,會把外鍵設(shè)置為null,前提是允許為null。
            SET_DEFAULT:此值設(shè)置,會把設(shè)置為外鍵的默認(rèn)值。
            SET():此值設(shè)置,會調(diào)用外面的值,可以是一個函數(shù)。


            default

            外鍵默認(rèn)值:如果子表有記錄參照下面三條

            1、如果不指定,運行makemigrateion出提示

            2、先建主表記錄,再ForeignKey,否則不符外鍵約束

            3、也可設(shè)置null=True設(shè)置為空


            related_query_name

            給定主表,通過related_query_name查詢副表字段,返回的是主表queryset對象

            給外鍵定義外部查詢字段,在filter里使用

            副表里定義:related_query_name='r'

            Group.objects.fileter(r__name='sa')

            返回的是副表name=sa對應(yīng)的Group

            limit_choices_to待查
            parent_link待查
            db_constraint待查

            表結(jié)構(gòu)代碼

            from?django.db?import?models class?UserInfo(models.Model): ????#?自動生成id,并設(shè)置為主鍵 ????name?=?models.CharField(max_length=32) ????age?=?models.SmallIntegerField() ???? ????#?定義關(guān)系,只寫模型名,默認(rèn)找JobLevel的primarykey字段 ????#?level?=?models.ForeignKey('JobLevel',on_delete=SET_DEFAULT,default='1') ???? ????#?to_field可以指定primarykey或unique字段,副表自動生成的依然是level_id字段 ????#?level?=?models.ForeignKey('JobLevel',?to_field='id') ???? ????level?=?models.ForeignKey('JobLevel',?to_field='id',?related_name='r_method', ???????????????????related_query_name='r_query',?on_delete='SET_NULL',null=true) ???? class?JobLevel(models.Model): ????#?自動生成id,并設(shè)置為主鍵 ????name?=?CharField(max_lengh=32) ????salary?=?IntegerField() ???? ???? #?添加:level可以賦對象值。 models.UserInfo.objects.create(username='root4',password=1111, ???????????????????????????????level=models.JobLevel.objects.filter(level='SS1').first() ???????????????????????????????)

            查詢:

            _set,主表操作副表記錄,須first或get獲取單一對象,Queryset列表不能使用_set

            #?-副表->主表 u=models.UserInfo.objects.filter(id=1).first()????????#?使用filter的結(jié)果是queryset對象,所以加first只取一個Models對象,方便操作。 u.level???????????????????????????????????????????????#?.定義的外鍵名,結(jié)果是JobLevel對象 u.level.salary????????????????????????????????????????#?.定義的外鍵名.主表字段,結(jié)果是查詢主表的對應(yīng)字段值? #?使用雙下劃線__查詢: u=models.UserInfo.objects.filter(level__salary=10000)?#?通過外鍵level__salary,查詢工資是10000的所有用戶 ???? #?-通過主表查副表: ????#使用related_name查詢 s=j.r_method.all()????????????????????????????????????#?通過related_name查詢,結(jié)果是queryset類型 ????#使用_set,需要把ForeignKey里面的related_name刪掉。否則報錯。 s=j.userinfo_set.all()????????????????????????????????#?結(jié)果和上面一樣 ????#使用related_query_name查詢 s=models.JobLevel.objects.filter(r_query__name='root')????#?root對應(yīng)的joblevel,返回的是QuerySet對象 ???? #?-通過副表__查詢主表: s=models.UserInfo.objects.filter(joblevel__name='s1')?????#?查詢S1職位對應(yīng)的所有用戶。

            修改

            update基于字段修改

            add基于對象更改,自動找到關(guān)聯(lián)外鍵字段

            對于ForeignKey對象,clear()和remove()方法僅在null=True時存在。

            一對多,對于.remove和.add只能在_set情況下使用,通過主表改副表里用,remove:清空字段,字段必須null=True

            #?修改1:使用queryset對象更新副表 j=models.JobLevel.objects.filter(id=2).first() u=models.UserInfo.objects.filter(id__lt=10)???????????#?注意獲取到的是queryset對象 u.update(level=j)?????????????????????????????????????#?因為level字段是一個對象,所以把查詢到的對象j賦值給level #?修改2:使用obj更新副表 for?u_obj?in?u:???????????????????????????????????????#?直接給UserInfo表賦值 ????u_obj.update(level_id=j.id) ????#?或:u_obj.update(level_id=2) #?修改3:使用_set修改,通過主表對象修改副表 j.userinfo_set.add(*u)????????????????????????????????#?使用*u把對象j傳給QuerySet對象 j.userinfo_set.add(obj_u)?????????????????????????????#?把j傳遞給obj_u的models對象。

            刪除:

            是指刪除副表關(guān)聯(lián)字段的值

            #?j.userinfo_set.remove(*u) #?這個是坑,*u里的所有對象必須都關(guān)聯(lián)id=2的對象,如果有關(guān)聯(lián)id=3的,會報錯?。。。?!

            2、_set,???主表操作副表記錄,須first或get獲取單一對象,Queryset列表不能使用_set

            level_obj?=?models.JobLevel.objects.filter(level='SS1').first()????#?必須first或get獲取單一對象,Queryset列表不能使用_set

            二、多對多關(guān)系

            表結(jié)構(gòu)代碼:

            1、使用ManyToManyField自動生成中間表結(jié)構(gòu)

            ????優(yōu)點:表自動維護,缺點:無法直接對表進行操作。

            默認(rèn)中間表名:應(yīng)用_表1_表1定義的外鍵名,例:ormtest_userinfo_dept_obj

            class?UserInfo(models.Model): ????#?自動生成id,并設(shè)置為主鍵 ????name?=?models.CharField(max_length=32) ????age?=?models.SmallIntegerField()?????? ????level?=?models.ForeignKey('JobLevel',?to_field='id',?related_name='r_method', ???????????????????related_query_name='r_query',?on_delete='SET_NULL',null=true) ????dept_obj?=?models.ManyToManyField('Dept') ???? class?Dept(models.Model): ????name?=?models.CharField(max_length=50) ????code?=?models.CharField(max_length=50,?unique=True)

            操作:

            """ManyToManyField""" #?創(chuàng)建Dept表記錄 models.Dept.objects.create(name='開發(fā)部',code='KF0001') models.Dept.objects.create(name='總務(wù)部',code='ZW0002') models.Dept.objects.create(name='采購部',code='CG0003') #?添加1,通過對象,add添加 u1?=?models.UserInfo.objects.filter(name='root').first() d1?=?models.Dept.objects.filter(name='開發(fā)部').first() u1.dept_obj.add(d1) #?添加1-2,通過對象,添加多個 u1?=?models.UserInfo.objects.filter(name='user') d1?=?models.Dept.objects.filter(name='開發(fā)部').first() d1.userinfo_set.add(*u1)????????#?把u1所有的對象都和d1建立關(guān)聯(lián) #?添加2,通過id,add添加 u1?=?models.UserInfo.objects.filter(name='root1').first() u1.dept_obj.add(*[1,?3])??????#?添加多個 u1.dept_obj.add(2)????????#?添加一個 #?添加3,通過對象,使用_set?返向add添加 u1?=?models.UserInfo.objects.filter(name='root').first() d1?=?models.Dept.objects.filter(name='開發(fā)部').first() d1.userinfo_set.add(u1) #?查詢1,使用__查副表字段: u3?=?models.UserInfo.objects.filter(dept_obj__name='開發(fā)部').all() #?查詢2,使用_set查詢 d3?=?models.Dept.objects.filter(name='開發(fā)部').first() u3?=?d3.userinfo_set????????????????????#?與查詢1的u3一樣 #?刪除1,移除field值,從中間表刪除整條記錄 u2?=?models.UserInfo.objects.filter(name='root').first() d2?=?models.Dept.objects.filter(name='總務(wù)部').first() d2.userinfo_set.remove(u2) #?刪除2,清空對應(yīng)的中間表記錄 d2.userinfo_set.clear() #?使用.set修改關(guān)聯(lián)值:通過中間表ID可以判斷出來,set原理是先刪除后建立 #?注意事項: ????#?1、u2對應(yīng)中間表多個記錄,set把所有對應(yīng)記錄全刪掉 ????#?2、set只創(chuàng)建對應(yīng)參數(shù)的記錄 u2.dept_obj.set('3')????????#?只創(chuàng)建一個對應(yīng)id為3的記錄 u2.dept_obj.set(['2','1'])??#?列表前不加*

            2、使用Foreignkey實現(xiàn)多表關(guān)聯(lián)

            ????優(yōu)點:可以自定義中間表結(jié)構(gòu)。

            class?UserInfo(models.Model): ????#?自動生成id,并設(shè)置為主鍵 ????name?=?models.CharField(max_length=32) ????age?=?models.SmallIntegerField()?????? ????department?=?models.ManyToManyField ????dept_obj?=?models.ManyToManyField('Dept') class?Dept(models.Model): ????name?=?models.CharField(max_length=50) ????code?=?models.CharField(max_length=50,?unique=True) class?UserInfo_To_Dept(models.Model): ????userinfo?=?models.ForeignKey('UserInfo') ????dept?=?models.ForeignKey('Dept') ????level?=?models.CharField(max_length=50)????????#?自定義的字段

            另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

            文章標(biāo)題:Django框架4:ORM高級操作-多表定義與操作-創(chuàng)新互聯(lián)
            當(dāng)前鏈接:http://www.jbt999.com/article36/eoosg.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、服務(wù)器托管品牌網(wǎng)站制作、Google移動網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

            手機網(wǎng)站建設(shè)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 国产亚洲AV成人噜噜噜 | 精品久久久久久久久久久 | 亚洲 精品 综合 精品 自拍 | 国产乱码一区二区三区的区别 | 伊人大香蕉超碰 |