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:

id name
1 something1
2 something2

usertype:

id caption something_id
1 超級管理員 1
2 普通管理員 1
3 黑客 2

userinfo:

id user pwd usertype_id
1 alex 123 1
2 eric 123 2

簡要說明

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范圍中的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM