1. 程式人生 > >13.Django之數據庫models&orm連表操作補充以及其他知識點補充(二)

13.Django之數據庫models&orm連表操作補充以及其他知識點補充(二)

http 但是 int migrate .py app migration esp rfi

一.外鍵關聯。

假如說,現在有兩張表,一張user表,這個表中存放了用戶賬戶信息,還有一張usertype表,這張表存放了用戶賬戶的類型。

from django.db import models

class UserType(models.Model):

#用戶類型表,雖然沒有創建ID字段,但是ID字段會自動創建。

type = models.CharField(max_length=32)

class User(models.Model):

#用戶表

username = models.CharField(max_length=16)

password = models.CharField(max_length=100)

utype = models.ForeignKey('UserType') #創建外鍵,關聯UserType表

#python manage.py makemigrations

#python manage.py migrate


二、插入數據。

接下來開始在表中插入數據。

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也就是普通用戶類型。


三、查找數據。

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方法返回的是元祖。



13.Django之數據庫models&orm連表操作補充以及其他知識點補充(二)