Django之model補充:一對多、跨表操作

表結構概述

model.py :

class Something(models.Model):name = models.CharField(max_length=32)class UserType(models.Model):caption = models.CharField(max_length=32)s = models.ForeignKey('Something')# 超級管理員,普通用戶,游客,黑河class UserInfo(models.Model):user = models.CharField(max_length=32)pwd = models.CharField(max_length=32)user_type = models.ForeignKey('UserType')# user_type_id

關系:

  • something --> usertype 一對多
  • usertype --> userinfo 一對多

表單中的數據:

something:

idname
1something1
2something2

usertype:

idcaptionsomething_id
1超級管理員1
2普通管理員1
3黑客2

userinfo:

iduserpwdusertype_id
1alex1231
2eric1232

簡要說明

Django中:

  1. 某表中foreignkey關聯另一張表后,會自動在本表單中創建一個名稱為另一張表的列:xxx_id
  2. 一對多創建時,foreignkey需要使用在一對多中的多的表單中

查詢

userinfo_obj = UserInfo.objects.all()

結果為一個類的列表,類似:[UserInfo對象,UserInfo對象,]

以上語句會得到的數據為一個元素為查詢目標表單對象的列表,所以例子中的userinfo_obj為一個queryset對象我們可以通過`print(userinfo_obj.query)來查看SQL語句.

取值

比較簡單:

id = userinfo_obj[0].user.id
user = userinfo_obj[0].user.user
pwd = userinfo_obj[0].user.pwd
...

values與vlue_list

queryset = UserInfo.objects.all().values('user')
結果:
[{‘user’: 'alex'},{‘user’: 'eirc'}]=================================queryset = UserInfo.objects.all().value_list('user')
結果:
[('alex'),('eirc')]

查詢中:

  • 使用values('列名稱'),結果為字典組成的列表
  • 使用value_list('列名稱'),結果為元組組成的列表

所以,未來操作中,我們可以使用這兩個方便的東西來遍歷字典取值還是使用元組取值

一對多操作

創建數據

一般我們是來這么做的:

UserInfo.objects.create(user='cc','pwd' = '123'user_type=UserType.objects.get(id=2))

很麻煩吧,其實是兩步操作了,但因為建表時有了user_type_id,所以我們可以這么搞:

UserInfo.objects.create(user='cc','pwd'='123',user_type_id=2)

很簡單吧...

數據查詢

單表查詢:

UserInfo.objects.filter(user='alex')

反向查詢

需求:查詢所有用戶類型等于 普通用戶 的所有用戶名和密碼

兩步操作:

uid = UserType.objects.filter(caption='普通用戶')
userinfo_obj = UserInfo.objects.filter(user_type_id=uid)

兩步操作很簡單,那就引出了神奇的雙下劃線:__

queryset = UserInfo.objcets.filter(user_type__caption='普通用戶')###結果
[UserInfo對象,UserInfo對象,UserInfo對象,]
row = queryset[0] #取到一個元素
user = row.user
password = row.pwd #取到具體信息
row.user_type.id 
row.user_type.caption 

總結下:

  • 一對多中,正下查詢使用foreignkey 的 _id 查詢:row.外鍵字段.外鍵表的字段
  • 一對多中反向查詢,首先還是在在一對多中的多的表單中查詢,可以使用__連接相關表中的列名去查詢:row__

其實感覺__有點像關系連線的意思

queryset = UserInfo.objects.filter(user_type__caption='普通用戶').values('user','pwd','user_type__caption')####結果
[{'user':'alex','pwd':'123','user_type__caption':'普通用戶'}{'user':'eric','pwd':'123','user_type__caption':'普通用戶'}]

三張表跨表操作

跟上面一樣,直接用__即可

queryset = UserInfo.objects.filter(user_type__s__name='xxx')

進階操作

獲取個數:

UserInfo.objects.filter(name = 'alex').count()

大于小于,還是使用雙下劃線__

UserInfo.objects.filter(id__gt=2)       #獲取ID大于2的數據
UserInfo.objects.filter(id__lt=5)       #獲取ID小余5的數據
UserInfo.objects.filter(id__gt=2,id__lt=5)  #獲取ID大于2小于5的數據

in:

UserInfo.objects.filter(id__in=[11,22,33])  #獲取id等于11、22、33的數據
UserInfo.objects.exclude(id__in=[11,22,33]) #not in

contains(包含):

UserInfo.objects.filter(name__contains="ven")   #獲取name列中包含'ven'的數據
UserInfo.objects.filter(name__icontains="Ven")  #獲取name列中包含'ven'的數據,對大小寫不敏感UserInfo.objects.exclude(name__icontains="ven") #不包含

range:

UserInfo.objects.filter(id__range=[1,10])   #范圍,between and ,獲取id在1到10范圍中的數據

轉載于:https://www.cnblogs.com/ccorz/p/5864470.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395104.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

農民約翰是一個驚人的會計_我的朋友約翰在CSS Grid中犯了一個錯誤。 不要像約翰-這樣做。

農民約翰是一個驚人的會計It had been two years and John had no job.已經兩年了,約翰沒有工作。 John was a smart 20-something guy. Okay, he had a job — but it wasn’t one he liked. It was too monotonous and was not nearly creative enough. His day …

zip直鏈生成網站_手把手教你如何用飛槳自動生成二次元人物頭像

【飛槳開發者說】李思佑,昆明理工大學信息與計算科學大四本科生;2018年和2019年兩次獲得全國大學生數學建模比賽國家二等獎;2020年美國數學建模比賽獲M獎。指導老師:昆明理工大學理學院朱志寧想畫出獨一無二的動漫頭像嗎&#xff…

Gradle入門到實戰(一) — 全面了解Gradle

聲明:本文來自汪磊的博客,轉載請注明出處 可關注個人公眾號,那里更新更及時,閱讀體驗更好: 友情提示由于文章是從個人公眾號拷貝過來整理的,發現圖片沒有正常顯示,沒關注公眾號的同學可通過如下…

java 0-9所有排列_java實現:鍵盤輸入從0~9中任意5個數,排列組合出所有不重復的組合,打印出來...

必有追加大分!!!比如1.2.3.4.5共有120個組合12345,12354,12435,12453,12534,12543;13245,13254,13425,13452,13524&#x…

智能家居物聯網化將成為AWE大會最大看點

AWE大會已經在今日9點半開幕,AWE在今年將擴張至8個展館,其整體展示規模達到11萬平米,這是以往都無法匹敵的。海爾、美的、格力、海信、創維、TCL、康佳、格蘭仕、澳柯瑪、新飛、美菱、奧馬、方太、老板、萬和、萬家樂、華帝、帥康、櫻花、格美…

PHP 命名空間(namespace)

PHP 命名空間(namespace) PHP 命名空間(namespace)是在PHP 5.3中加入的,如果你學過C#和Java,那命名空間就不算什么新事物。 不過在PHP當中還是有著相當重要的意義。 PHP 命名空間可以解決以下兩類問題: 用戶編寫的代碼與PHP內部的類/函數/常量…

給matrix重新列名_如何認真升級Mac終端(甚至給它一個Matrix主題)

給matrix重新列名by Marcus Gardiner通過馬庫斯加德納(Marcus Gardiner) 如何認真升級Mac終端(甚至給它一個Matrix主題) (How to seriously upgrade your Mac terminal (and even give it a Matrix theme)) 藍色藥丸,紅色藥丸和通往極樂世界的3個步驟 (A Blue Pill…

javaweb 圖書管理系統完整代碼_看一名Java開發人員以紅隊思維五分鐘審計一套代碼(續)...

前言上篇文章的發布引起了很多讀者的瀏覽,有很多讀者也催更希望讀到續集,作者也收獲到讀者的鼓勵,說明這條路線對大家有幫助,是有意義的。所以,今天作者將繼續闡述在審計Java代碼時的思路。概述上篇文章所講的SQL注入和…

愛立信數據分析解決方案抓住物聯網發展機遇

愛立信在2016年1月6日至9日于美國拉斯維加斯舉辦的國際消費電子展(CES)上推出“用戶和物聯網數據分析”解決方案。該解決方案將能幫助運營商提高對用戶和物聯網終端的內部管理效率,同時探索跨越多個垂直領域的新型物聯網應用。 用戶和物聯網數…

Lua初學習 9-12 基礎

1:string 轉 number :tonumber(string) 2: number 轉 string :tostring(number) 3:string API: Lua中的字符串是不可變值,a "cocotang" string.gsub(a,"c","z") print(a) ----> cocotang 1獲得字符串長度:string.le…

iview下拉選

問題描述:創建場景,連續創建場景時,第一個場景創建成功后,第二次進入創建窗口,點擊測試任務下拉編輯只有上次創建成功的那一個任務候選,選中該任務中,關聯腳本也只有上次成功創建的唯一個候選下…

JAVA實現在面板中添加圖表_Java 創建PowerPoint圖表并為其添加趨勢線

圖表,是指將既得數據用圖形的方式表示出來。在前文中我們介紹過如何使用Java程序來為Excel文檔創建圖表的方法。本文將通過使用Java程序來演示如何創建PowerPoint圖表及為圖表添加趨勢線。趨勢線的運用能夠顯示數據的變化趨勢,同時能夠幫助預測數據的未來…

code warri_我參加了有史以來的第一屆Warri Tech宣傳活動。 這是我學到的。

code warriIn the city of Warri, Delta state of Nigeria, there is a saying that goes “Warri nor dey carry last, if e hard well well na draw”. This translates to “Warri is never behind in the scheme of things (events)”.在尼日利亞三角洲州的沃里市&#xff…

Socket編程小結

目錄: 什么是 socket?... 1 Internet 套接字的兩種類型... 1 網絡理論... 2 結構體... 2 本機轉換... 3 IP 地址和如何處理它們... 4 socket()函數... 4 bind()函數... 4 connect()程序... 5 listen()函數... 6 accept()函數... 6 send() and recv() 7 …

idea設置中文界面_《英雄聯盟手游》設置界面中文翻譯圖分享 外服漢化界面一覽...

導讀 英雄聯盟手游目前以及正式上線了,不過現在的話是沒有中文版的,只有外服,所有很多地方是看不懂的,也不明白的,這樣的話就需要翻譯了,具體要怎么設置會比較,相關的步驟是什么呢?下…

windows 2008 r2 系統默認80端口被系統占用的處理

--windows 2008 r2 系統默認80端口被系統占用的處理 --使用netstat 命令查看指定端口netstat -ano | findstr :80----如下所示:本地的80端口被進程為4的占用 TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4 TCP 192.168.1.207:60652 …

java實現封裝的三部_Java 封裝

Java 封裝在面向對象程式設計方法中,封裝(英語:Encapsulation)是指,一種將抽象性函式接口的實作細節部份包裝、隱藏起來的方法。封裝可以被認為是一個保護屏障,防止該類的代碼和數據被外部類定義的代碼隨機訪問。要訪問該類的代碼…

小豬短租超棒新房_freeCodeCamp講座簡介:您可以免費觀看的超棒技術講座

小豬短租超棒新房by Quincy Larson昆西拉爾森(Quincy Larson) freeCodeCamp講座簡介:您可以免費觀看的超棒技術講座 (Introducing freeCodeCamp Talks: awesome tech talks you can watch for free) Developers give thousands of tech talks every year at confer…

安卓10不支持qmc解碼_官宣:安卓10已發布!21款手機已適配,小米華為率先支持...

隨著今天凌晨谷歌 I/O 大會的召開,Android Q 也就是安卓10正式官宣,新版的安卓10加入了諸多新手勢,從 Home 鍵設計上看,安卓10 的新版手勢很大程度上有疑似借鑒 iOS 的手勢,底部一個長條,作為 Home 用來返回…

linux系統編程之進程(七):system()函數使用【轉】

本文轉載自:http://www.cnblogs.com/mickole/p/3187974.html 一,system()理解 功能:system()函數調用“/bin/sh -c command”執行特定的命令,阻塞當前進程直到command命令執行完畢 原型: int system(const char *comma…