一.外鍵關聯。
python
假如說,如今有兩張表,一張user表,這個表中存放了用戶帳戶信息,還有一張usertype表,這張表存放了用戶帳戶的類型。django
from django.db import modelsapp
class UserType(models.Model):ide
#用戶類型表,雖然沒有建立ID字段,可是ID字段會自動建立。orm
type = models.CharField(max_length=32)對象
class User(models.Model):it
#用戶表
io
username = models.CharField(max_length=16)
class
password = models.CharField(max_length=100)test
utype = models.ForeignKey('UserType') #建立外鍵,關聯UserType表
#python manage.py makemigrations
#python manage.py migrate
2、插入數據。
接下來開始在表中插入數據。
from app01 import models
def test(request):
models.UserType.objects.create(type='admin')
models.UserType.objects.create(type='user')
models.User.objects.create(username='admin',password='admin',utype_id=1)
models.User.objects.create(username='aaa',password='123',utype_id=2)
models.User.objects.create(username='bbb',password='123',utype_id=2)
return HttpResponse('test')
#在User用戶表中,插入了三行數據。
#在業務中能夠理解爲建立了三個帳戶,admin對應了用戶admin類型,aaa,bbb對應了user也就是普通用戶類型。
3、查找數據。
1.跨表查詢,正向查找示例。
result = models.User.objects.all() #queryset 對象 queryset[obj,obj,obj]
for obj in result:
print(obj.username,obj.password.obj.utype_id,obj.utype.type)
輸出結果以下:
admin admin 1 admin
aaa 123 2 user
bbb 123 2 user
2.跨表查詢,逆向查找示例。
假如如今有一種需求,經過usertype查找用戶。
示例以下:
obj = models.UserType.objects.all().first() #取出usertype表中的第一個對象
#print(obj.user_set.all()) #返回一個queryset類型的數據,會把這個類型對應的用戶所有列出來。
#!!!!注意!!這個obj.user_set中的user表明的是User表,可是在django中,若是須要反向查找的話!!反向查找的表必定要小寫!!而後在後面跟_set!!
print('用戶類型',obj.id,obj.type)
for row in obj.user_set.all(): # obj.user_set.all()取出了全部與UserType表中第一條記錄對應的用戶類型,返回一個queryset類型,而此時的row變量的內容爲queryset中的user對象。
print(row.username,row.password)
輸出結果以下:
admin admin
#也就是說,逆向查找的方法,就是表名小寫外加_set(下劃線set)。
逆向查找還能夠經過filter過濾:
obj = models.UserType.objects.all()
for item in obj:
print(item.type,item.user_set.filter(username='admin'))
3.關於django orm的一些補充說明。
#!返回單條記錄的時候,返回的是一個和表同名的對象!#
#!在返回多條記錄時,必定會返回一個queryset對象!#
關於values: Queryset[{'username':'xxx','password':'xxx'}] 將數據以字典形式返回。
result = models.User.objects,all().values('username','password') #生成一個queryset數據類型,可是這個查詢結果只有username列和password列。
#不過不一樣的是,這裏面的queryset中存放的不是一個個對象了,而是字典。 Queryset[{'username':'xxx','password':'xxx'}]
for row in result:
print(row) #獲取queryset中的字典數據類型。
關於values_list:
result = models.User.objects,all().values_list('username','password')
#生成一個queryset數據類型,可是這個查詢結果只有username列和password列,不一樣的是,這裏面的queryset中存放的是元祖類型。
# Queryset[('username','xxx'),('password','xxx')]
!!在使用values和values_list時,如何跨表?
經過雙下劃線_ _跨表正向查找:
res = models.User.object.all().values('id','username','password','utype_ _type') #utype字段經過外鍵關聯了UserType表,經過utype字段跨表去取UserType表中的type字段中的內容。
總結:
若是不使用values方法或者values_list方法,最後只會返回對象。
使用values方法返回字典。
使用vlaues_list方法返回的是元祖。