欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年03月28日 09:49:47   作者:腎虛少年  
這篇文章主要介紹了使用Django實現(xiàn)把兩個模型類的數(shù)據(jù)聚合在一起,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

比如有模型類A和B,A和B之間有外鍵關(guān)聯(lián)在一起,A是子表,B是父表(反過來沒試過。。因為大部分?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對象是可以比較兩個關(guān)聯(lián)模型類的字段數(shù)據(jù)的。

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

但是我用Django2.0時會報錯。。真是搞不懂,后來我直接使用字段名居然可以,醉了。

反正都可以試試吧

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

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

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

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

models.py如下

class Level(models.Model):
 # l_num = models.IntegerField(default=0, verbose_name='序號')
 name = models.CharField(max_length=20)
 is_delete = models.BooleanField(default=False)
 
 def __str__(self):
  return self.name

class Grades(models.Model):
 name = models.CharField(max_length=20, verbose_name='班級')
 # 外鍵,這里關(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='年齡')

 # 需要先提供一個二維的二元元組,第一個元素表示存在數(shù)據(jù)庫內(nèi)真實的值,第二個表示頁面上顯示的具體內(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="班級")
 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)建時間')
 last_update_time = models.DateTimeField(auto_now=True, verbose_name='上次更新時間')
 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')

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

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

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

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

class Students(models.Model):

  # 寫一個方法,定義在管理頁面上能夠顯示的外鍵字段字段
  # grade為Students模型的外檢表,level為Grades模型的外檢表,那么為Level模型的字段
  def dis_level(self):
   return self.grade.level.name

  # 定義該字段在管理后臺顯示的名稱
  dis_level.short_description = '年級'
  
 # 定義該字段在管理后臺顯示的名稱
 dis_level.short_description = '年級'
 # 方法列是不能排序的,如果需要排序需要為方法指定排序依據(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ìn)行排序:

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

默認(rèn)對學(xué)生編輯時,無法在編輯頁面直接編輯相關(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='年齡')

 # 需要先提供一個二維的二元元組,第一個元素表示存在數(shù)據(jù)庫內(nèi)真實的值,第二個表示頁面上顯示的具體內(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="班級")
 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)建時間')
 last_update_time = models.DateTimeField(auto_now=True, verbose_name='上次更新時間')
 is_delete = models.BooleanField(default=False)
 
 def __str__(self):
  return self.name


class Course(models.Model):
 name = models.CharField(max_length=20, verbose_name='課名')
 is_delete = models.BooleanField(default=False)
 
 def __str__(self):
  return self.name


class 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)換為字符串,否則會報下面的錯誤。
  """
   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é)生的編輯頁面,是這樣子的:

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

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

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

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

做完之后,效果如下:

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

相關(guān)文章

  • python內(nèi)置函數(shù)breakpoint()與bytearray()示例詳解

    python內(nèi)置函數(shù)breakpoint()與bytearray()示例詳解

    本文給大家分享的是python內(nèi)置函數(shù)breakpoint()與bytearray()的相關(guān)資料,并給大家附上了詳細(xì)代碼,有需要的小伙伴可以參考下
    2017-04-04
  • 解決Django連接db遇到的問題

    解決Django連接db遇到的問題

    今天小編大家分享一篇解決Django連接db遇到的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 基于python爬取有道翻譯過程圖解

    基于python爬取有道翻譯過程圖解

    這篇文章主要介紹了基于python爬取有道翻譯過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Python實現(xiàn)生成帶logo背景圖的二維碼

    Python實現(xiàn)生成帶logo背景圖的二維碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Python實現(xiàn)生成帶logo背景圖的二維碼(靜態(tài)和動態(tài)圖),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-05-05
  • python線程池的實現(xiàn)實例

    python線程池的實現(xiàn)實例

    這篇文章主要介紹了python線程池的實現(xiàn)方法,代碼簡單實用,供大家參考使用
    2013-11-11
  • matplotlib給子圖添加圖例的方法

    matplotlib給子圖添加圖例的方法

    今天小編就為大家分享一篇matplotlib給子圖添加圖例的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • python 使用正則表達(dá)式判斷圖片路徑是否是超鏈接的示例

    python 使用正則表達(dá)式判斷圖片路徑是否是超鏈接的示例

    在Python中,判斷一個給定的字符串(假設(shè)為圖片路徑)是否是網(wǎng)頁鏈接(URL),你可以通過檢查該字符串是否符合URL的基本格式來實現(xiàn),以下是一個使用正則表達(dá)式來判斷給定字符串是否為網(wǎng)頁鏈接(URL)的示例,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • pyside6-uic生成py代碼中文為unicode(亂碼)的問題解決方案

    pyside6-uic生成py代碼中文為unicode(亂碼)的問題解決方案

    這篇文章主要介紹了如何解決pyside6-uic生成py代碼中文為unicode(亂碼)的問題,文中通過代碼和圖文介紹的非常詳細(xì),對大家解決問題有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Python 機(jī)器學(xué)習(xí)工具包SKlearn的安裝與使用

    Python 機(jī)器學(xué)習(xí)工具包SKlearn的安裝與使用

    Sklearn(全稱 SciKit-Learn),是基于 Python 語言的機(jī)器學(xué)習(xí)工具包。本文將簡單的介紹SKlearn安裝與使用,想要入坑機(jī)器學(xué)習(xí)的同學(xué)可以參考下
    2021-05-05
  • Python?獲取今天任意時刻的時間戳的方法

    Python?獲取今天任意時刻的時間戳的方法

    本文主要介紹了Python?獲取今天任意時刻的時間戳的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2022-06-06

最新評論