表結構概述
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中:
- 某表中foreignkey關聯另一張表后,會自動在本表單中創建一個名稱為另一張表的列:xxx_id
- 一對多創建時,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范圍中的數據