亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

使用Django實(shí)現(xiàn)把兩個(gè)模型類的數(shù)據(jù)聚合在一起

瀏覽:27日期:2024-10-18 08:09:35

Django中想要把模型類聚合得到想要的數(shù)據(jù)可以用F對(duì)象。

比如有模型類A和B,A和B之間有外鍵關(guān)聯(lián)在一起,A是子表,B是父表(反過來沒試過。。因?yàn)榇蟛糠謹(jǐn)?shù)據(jù)都是用子表的,我想是可以的),那么可以這樣查:

A.objects.filter(userid=3,bookid=F(bid))

其中userid,bookid是模型類A的字段,bid是模型類B的字段。

這樣操作的結(jié)果就是可以查詢到userid為3且模型類A字段bookid等于模型類B字段bid的集合數(shù)據(jù)了。

F對(duì)象是可以比較兩個(gè)關(guān)聯(lián)模型類的字段數(shù)據(jù)的。

我看到網(wǎng)上有說F對(duì)象可以這樣用F(’b__id’) ==>F(’模型類名小寫__字段名’),此處是雙下劃線。

但是我用Django2.0時(shí)會(huì)報(bào)錯(cuò)。。真是搞不懂,后來我直接使用字段名居然可以,醉了。

反正都可以試試吧

A.objects.filter(userid=3,bookid=F(bid))

A.objects.filter(userid=3,bookid=F(’b__bid’))

補(bǔ)充知識(shí):Django Admin頁面顯示父表,編輯子表

默認(rèn)情況下,ModelAdmin只允許您管理模型“本身”字段,而不是相關(guān)模型.以下方法將實(shí)現(xiàn),在應(yīng)用類的列表管理顯示頁面,顯示父表的字段;在編輯頁面,父表對(duì)子表進(jìn)行編輯.

models.py如下

class Level(models.Model): # l_num = models.IntegerField(default=0, verbose_name=’序號(hào)’) name = models.CharField(max_length=20) is_delete = models.BooleanField(default=False) def __str__(self): return self.nameclass Grades(models.Model): name = models.CharField(max_length=20, verbose_name=’班級(jí)’) # 外鍵,這里關(guān)聯(lián)模型Level與模型名稱一樣,不是全小寫。 level = models.ForeignKey(’Level’, on_delete=models.DO_NOTHING) is_delete = models.BooleanField(default=False) def __str__(self): return ’%s%s’ % (self.level, self.name)class Students(models.Model): name = models.CharField(max_length=20, db_index=True, verbose_name=’姓名’) age = models.IntegerField(verbose_name=’年齡’) # 需要先提供一個(gè)二維的二元元組,第一個(gè)元素表示存在數(shù)據(jù)庫內(nèi)真實(shí)的值,第二個(gè)表示頁面上顯示的具體內(nèi)容 SEX_CHOICE = ( (’男’, ’男’), (’女’, ’女’), ) sex = models.CharField(max_length=10, choices=SEX_CHOICE, verbose_name=’性別’, default=’男’) grade = models.ForeignKey(’Grades’, on_delete=models.DO_NOTHING, verbose_name='班級(jí)') img_student = models.ImageField(upload_to=’img_student’, default=’img_student/default.png’, verbose_name=’頭像’) create_time = models.DateTimeField(auto_now_add=True, verbose_name=’創(chuàng)建時(shí)間’) last_update_time = models.DateTimeField(auto_now=True, verbose_name=’上次更新時(shí)間’) is_delete = models.BooleanField(default=False) def __str__(self): return self.name

在admin.py代碼如下:

@admin.register(Students)class StudentsAdmin(admin.ModelAdmin): list_display = (’name’, ’age’, ’sex’, ’grade’, ’create_time’, ’last_update_time’, ’is_delete’)

做完之后,顯示的效果如下:

使用Django實(shí)現(xiàn)把兩個(gè)模型類的數(shù)據(jù)聚合在一起

在應(yīng)用類的列表管理顯示頁面,顯示父表的字段

可以讓Students,顯示父表Grades的父表Level字段

在models.py里的Students類里,寫上如下代碼:

class Students(models.Model):

# 寫一個(gè)方法,定義在管理頁面上能夠顯示的外鍵字段字段 # grade為Students模型的外檢表,level為Grades模型的外檢表,那么為Level模型的字段 def dis_level(self): return self.grade.level.name # 定義該字段在管理后臺(tái)顯示的名稱 dis_level.short_description = ’年級(jí)’ # 定義該字段在管理后臺(tái)顯示的名稱 dis_level.short_description = ’年級(jí)’ # 方法列是不能排序的,如果需要排序需要為方法指定排序依據(jù)。添加的是’模型類字段’ # 如果是外鍵需要遵循這樣的語法:本表外鍵字段__(雙下劃線)外檢表字段或外檢表的外鍵字段__最終外鍵表要顯示的字段。 dis_level.admin_order_field = ’grade__level__name’

在admin.py里,把Students類里的方法,加入到list_display里:

@admin.register(Students)class StudentsAdmin(admin.ModelAdmin): list_display = (’name’, ’age’, ’sex’, ’grade’, ’dis_level’, ’create_time’, ’last_update_time’, ’is_delete’)

寫完之后,顯示的結(jié)果如下,多了年級(jí),以及點(diǎn)擊年級(jí)可以進(jìn)行排序:

使用Django實(shí)現(xiàn)把兩個(gè)模型類的數(shù)據(jù)聚合在一起

在編輯頁面,父表對(duì)子表進(jìn)行編輯.

默認(rèn)對(duì)學(xué)生編輯時(shí),無法在編輯頁面直接編輯相關(guān)聯(lián)的子表,例如:

models.py代碼:

class Students(models.Model): name = models.CharField(max_length=20, db_index=True, verbose_name=’姓名’) age = models.IntegerField(verbose_name=’年齡’) # 需要先提供一個(gè)二維的二元元組,第一個(gè)元素表示存在數(shù)據(jù)庫內(nèi)真實(shí)的值,第二個(gè)表示頁面上顯示的具體內(nèi)容 SEX_CHOICE = ( (’男’, ’男’), (’女’, ’女’), ) sex = models.CharField(max_length=10, choices=SEX_CHOICE, verbose_name=’性別’, default=’男’) grade = models.ForeignKey(’Grades’, on_delete=models.DO_NOTHING, verbose_name='班級(jí)') img_student = models.ImageField(upload_to=’img_student’, default=’img_student/default.png’, verbose_name=’頭像’) create_time = models.DateTimeField(auto_now_add=True, verbose_name=’創(chuàng)建時(shí)間’) last_update_time = models.DateTimeField(auto_now=True, verbose_name=’上次更新時(shí)間’) is_delete = models.BooleanField(default=False) def __str__(self): return self.nameclass Course(models.Model): name = models.CharField(max_length=20, verbose_name=’課名’) is_delete = models.BooleanField(default=False) def __str__(self): return self.nameclass Score(models.Model): s_score = models.IntegerField(default=0, verbose_name=’分?jǐn)?shù)’) s_course = models.ForeignKey(’Course’, on_delete=models.DO_NOTHING, verbose_name=’課程’) s_student = models.ForeignKey(’Students’, on_delete=models.DO_NOTHING, verbose_name=’學(xué)生姓名’) is_delete = models.BooleanField(default=False) def __str__(self): # 要把s_score轉(zhuǎn)換為字符串,否則會(huì)報(bào)下面的錯(cuò)誤。 ''' Exception Type:TypeError Exception Value: __str__ returned non-string (type int) :return: ''' return ’%s%s%s’ % (self.s_student, self.s_course, str(self.s_score))

打開學(xué)生的編輯頁面,是這樣子的:

使用Django實(shí)現(xiàn)把兩個(gè)模型類的數(shù)據(jù)聚合在一起

要給學(xué)生添加分?jǐn)?shù),只能進(jìn)入Score管理頁面,一個(gè)個(gè)添加,非常麻煩.

使用Django的TabularInline,可以解決這個(gè)問題,在父表里對(duì)子表進(jìn)行編輯:

所有代碼都在admin.py里寫,具體如下:

# 一對(duì)多關(guān)聯(lián)表編輯,讓父表管理配置頁面能同時(shí)編輯子表,以下的Score為子表(有外鍵所在的表)class ScoreInline(admin.TabularInline): # Score 必須是models.py中的模型名稱,大小寫必須要匹配.這個(gè)模型為子表,以便可以被父表編輯 model = Score # 默認(rèn)顯示條目的數(shù)量 # extra = 5 class StudentsAdmin(admin.ModelAdmin): # Inline把ScoreInline關(guān)聯(lián)進(jìn)來,讓父表管理配置頁面能同時(shí)編輯子表. inlines = [ScoreInline, ]

做完之后,效果如下:

使用Django實(shí)現(xiàn)把兩個(gè)模型類的數(shù)據(jù)聚合在一起

以上這篇使用Django實(shí)現(xiàn)把兩個(gè)模型類的數(shù)據(jù)聚合在一起就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Django
相關(guān)文章:
主站蜘蛛池模板: 国产日韩一区 | 一级免费黄色 | 婷婷亚洲天堂 | 欧美亚洲免费 | 第一福利在线 | 最新大黄网站免费 | 精品成人乱色一区二区 | 黄色成人免费观看 | 六月亚洲精品一区 | www.日本一区 | 亚洲欧美中文日韩综合 | 在线欧美69v免费观看视频 | 亚洲精品tv久久久久久久久 | 综合久久一区二区三区 | 亚洲国产欧美国产第一区 | 久久久久国产精品免费 | 精品三级国产一区二区三区四区 | 四虎永久免费地址ww 41.6 | 日韩精品亚洲专区在线影视 | 33333在线亚洲 | japanese日本护士xx亚洲 | 国产精品大尺度尺度视频 | 亚洲精品第一综合99久久 | 久久精品人 | 97se狠狠狠狠狠亚洲综合网 | 香港三级欧美国产精品 | 国产精品国产主播在线观看 | 欧美精品第1页在线播放 | 玖玖99| 福利精品一区 | 美国一级大黄大色毛片视频一 | 三级黄.色 | 999精品| 男女很黄很色床视频网站免 | 国产视频精品免费 | 麻豆视频链接 | 国产区网址 | chinese国产一区二区 | 国产sss | 波多野吉衣一区二区三区四区 | 国产丝袜护土调教在线视频 |