日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Django多層嵌套ManyToMany字段ORM操作詳解

瀏覽:26日期:2024-10-04 18:22:36

在用django寫項目時,遇到了許多場景,關于ORM操作獲取數據的,但是不好描述出來,百度搜索關鍵詞都不知道該怎么搜,導致一個人鼓搗了好久。這里細化下問題,還原場景,記錄踩下的坑

首先先列舉model,我舉些生活中的例子,更方便理解問題

# 習題class Problem(models.Model): desc = models.CharField() answer = models.TextField() is_pass = models.BooleanField(default=False, verbose_name='是否通過')# 章節class Chapter(models.Model): _id = models.IntegerField(verbose_name='編號') title = models.CharField() problem = models.ManyToManyField(Problem) pass_rate = models.IntegerField(verbose_name='通關率')# 書籍 class Book(models.Model): title = models.CharField() desc = models.TextField() chapter = models.ManyToManyField(Chapter,verbose_name='章節') speed = models.IntegerField(verbose_name='學習進度', default=0)

假設是一本數學書,有5個章節,每個章節里有數量不等的習題,

即book與chapter是多對多,chapter與problem也是多對多

場景一: 書籍下的所有習題

# 按我的理解是取問題非空的章節數# 類似于問爺爺有幾個孫子,沒辦法跨輩,就按一個孫子對應一個爸爸來取(有重復)book.chapter.filter(problem___id__isnull=False).count()

場景二:書籍下所有通過的習題

book.chapter.filter(problem__is_pass=True).count()

場景三: 判斷某個問題是否在這本書里

def problem_in_ladder(book, problem): for i in book.chapter.all(): if problem in i.problem.all():return True return False

盡可能的減少view中對models的取值操作,所以把上面幾個場景方法寫在models類中

最終的models

# 習題class Problem(models.Model): desc = models.CharField() answer = models.TextField() is_pass = models.BooleanField(default=False, verbose_name='是否通過')# 章節class Chapter(models.Model): _id = models.IntegerField(verbose_name='編號') title = models.CharField() problem = models.ManyToManyField(Problem) pass_rate = models.IntegerField(verbose_name='通關率') @property def items(self): return self.problem.count() @property def pass_problem(self): return self.problem.filter(is_pass=True).count() # 書籍 class Book(models.Model): title = models.CharField() desc = models.TextField() chapter = models.ManyToManyField(Chapter,verbose_name='章節') speed = models.IntegerField(verbose_name='學習進度', default=0) @property def chapters(self): return self.chapter.count() @property def pass_count(self): return self.chapter.filter(problem__is_pass=True).count() @property def items(self): return self.chapter.filter(problem___id__isnull=False).count()

補充知識:django中當model設置了ordering后,使用distinct()和annotate()問題記錄

model類如下,我在class Meta中設置了ordering = [’-date_create’],即模型對象返回的記錄結果集是按照這個字段排序的。

class SystemUserPushHistory(models.Model): id = models.UUIDField(default=uuid.uuid4, primary_key=True) host_name = models.CharField(max_length=128, null=False) system_username = models.CharField(max_length=128, null=False) method = models.CharField(max_length=32, null=False) is_success = models.BooleanField(default=False) date_create = models.DateTimeField(auto_now_add=True, editable=False) message = models.CharField(max_length=4096, null=True) class Meta: db_table = 'assets_systemuser_push_history' ordering = [’-date_create’] def __str__(self): ret = self.system_username + ' => ' + self.host_name return ret

當業務有需求如對host_name進行分組顯示,在代碼中用到了annotate,如下。

>>> from django.db.models import Count >>> from assets.models import SystemUserPushHistory>>> p = SystemUserPushHistory.objects.values('host_name').annotate(dcount=Count(1))>>> p<QuerySet [{’host_name’: ’點2’, ’dcount’: 1}, {’host_name’: ’點3’, ’dcount’: 2}, {’host_name’: ’點2’, ’dcount’: 1}, {’host_name’: ’點3’, ’dcount’: 1}]>>>> print(p.query)SELECT `assets_systemuser_push_history`.`host_name`, COUNT(1) AS `dcount` FROM `assets_systemuser_push_history` GROUP BY `assets_systemuser_push_history`.`host_name`, `assets_systemuser_push_history`.`date_create` ORDER BY `assets_systemuser_push_history`.`date_create` DESC

可以看到,所得到的結果并不像我們預期的一樣,之后把執行的sql輸出出來可以看到在group by的時候是對host_name和date_create進行分組,原因就是因為我們在model類中設置了ordering,去掉之后代碼運行正常。

使用distinct和上面的情況類似,就不列出來了。

以上這篇Django多層嵌套ManyToMany字段ORM操作詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99成人在线| 亚洲日韩中文字幕一区| 中文字幕av亚洲精品一部二部 | 成人在线免费观看网站| 国产日韩欧美一区| 日韩高清在线不卡| 日本麻豆一区二区三区视频| 日韩精品亚洲专区在线观看| 日韩精品五月天| 国产亚洲精aa在线看 | 日韩精品首页| 亚洲午夜黄色| 亚洲一二av| 国产亚洲高清一区| 欧美a在线观看| а√在线中文在线新版| 日韩在线观看| 99国产精品视频免费观看一公开| 视频一区二区不卡| 亚洲一级大片| 国产精品白浆| 蜜桃成人av| 日韩av不卡在线观看| 蜜臀久久精品| 日韩中文字幕区一区有砖一区| 日韩一区二区三区精品 | 久久一区二区三区电影| 一区二区国产在线观看| 韩国女主播一区二区三区| 欧美成人久久| 国产精品2023| 亚洲午夜91| 国产精品乱战久久久| 999久久久国产精品| 综合一区av| 亚洲天堂久久| 国产va免费精品观看精品视频| 极品日韩av| 精品亚洲免a| 蜜桃视频在线观看一区二区| 成人在线视频免费看| 亚洲精一区二区三区| 欧洲一区二区三区精品| 久久激情五月婷婷| 免费在线观看成人| 伊伊综合在线| 欧美亚洲二区| 国产婷婷精品| 99精品在线观看| 精品一区二区三区中文字幕| 亚洲欧洲免费| 亚洲美洲欧洲综合国产一区| 日本aⅴ精品一区二区三区| 午夜在线一区二区| 亚洲大片在线| 九九色在线视频| 精品久久久网| 国产精品一国产精品k频道56| 在线免费观看亚洲| 国产精品三上| 国产视频亚洲| 99精品在线观看| 日韩av二区| 欧美成人a交片免费看| 欧美激情福利| 国产成人77亚洲精品www| 精品欧美日韩精品| 国产成人久久| 伊人久久在线| 日韩在线观看不卡| 欧美色图国产精品| 久久久久.com| 国产亚洲精品自拍| 亚洲精品日本| 国产精品一级在线观看| 久久精品伊人| 国产aⅴ精品一区二区四区| 成人小电影网站| 99视频一区| 日韩高清电影免费| 国产精品传媒麻豆hd| 日韩精品诱惑一区?区三区| 欧美a级片一区| 日韩制服丝袜av| 国产极品久久久久久久久波多结野 | 免费观看在线综合色| 日韩av网站在线免费观看| 日韩综合一区二区| 精品视频免费| 午夜久久tv| 青草国产精品| 日韩欧美精品综合| 亚洲一区av| 精品国产第一福利网站| 亚洲欧美日韩一区在线观看| 国产麻豆一区| 91tv亚洲精品香蕉国产一区| 日本精品另类| 日本高清不卡一区二区三区视频| 亚洲精品美女91| 水蜜桃久久夜色精品一区| 老司机精品久久| 精品久久久中文字幕| 亚洲专区视频| 91精品二区| 美女视频网站久久| 日韩专区欧美专区| 欧洲一级精品| 国产乱人伦丫前精品视频 | 一区二区三区午夜视频| 久久精品影视| 激情中国色综合| 日本色综合中文字幕| 蜜桃视频一区二区三区在线观看| 视频在线不卡免费观看| 亚洲aa在线| 激情综合网五月| 麻豆精品蜜桃| 国产不卡精品| 嫩呦国产一区二区三区av| 国产日韩欧美| 青草久久视频| 日本欧美在线| 亚洲精品中文字幕99999| 国产精品普通话对白| 久久精品国产亚洲夜色av网站| 国产欧美大片| 国产精品中文| 日韩欧美中文字幕电影| 蜜桃久久久久久| 久久亚洲风情| 中文一区在线| 在线综合欧美| 欧美网站在线| 久久夜色精品| 日韩精选在线| 国产精品videossex久久发布| 亚洲精品人人| 日本欧美在线| 欧美激情三区| 日韩免费看片| 午夜久久久久| 日韩国产欧美在线播放| 国产精品麻豆成人av电影艾秋| 蜜桃精品视频| 亚洲1234区| 女人av一区| 久久高清免费观看| 国产欧美日韩视频在线 | 国产欧美一级| 成人国产精品久久| 欧美精选一区二区三区| 一区二区三区四区在线观看国产日韩| 日韩二区三区在线观看| 成人亚洲一区二区| 免费一区二区视频| 精品视频网站| 国产亚洲综合精品| 在线一区视频| 美女久久久精品| 99re国产精品| 久久女人天堂| 久久亚洲图片| 91亚洲国产成人久久精品| 亚洲自啪免费| 日韩av二区| 少妇精品在线| 久久中文亚洲字幕| 国产探花在线精品| 亚洲精品123区| 亚洲欧洲高清| 国产美女久久| 亚洲制服欧美另类| 欧美男人天堂| 国产精品videossex久久发布 | 久久精品国产网站| 午夜在线观看免费一区| 久久精品系列| 欧美天堂一区| 日韩激情一区二区| 亚洲欧美网站| 成人精品天堂一区二区三区| 青青青国产精品| 免费在线观看成人| 自由日本语亚洲人高潮| 日本在线精品| 女生影院久久| 国产91在线播放精品| 国产精品久久久久久久久久久久久久久| 一区在线视频观看| 国产成人精品亚洲日本在线观看| 国产精品v亚洲精品v日韩精品| 日韩一区二区三区精品视频第3页| 婷婷综合亚洲| 99亚洲精品| 亚洲综合不卡| 999国产精品视频| 久久久久久自在自线| 国产成人精品三级高清久久91| 麻豆国产一区|