DjanGo數據庫查詢方法進階


一對一查詢

def test(request):

    ### 增加
    # models.UserInfo.objects.create(name='zekai', age=18)
    # models.Salary.objects.create(money="3000", us_id=1)


    ### 查詢:
    ## 正向查詢(子表查母表):
    ### 1.11.22 :res.us.name
    ### 1.11.10 : res.母表表名小寫.name
    # res = models.Salary.objects.filter(money="3000").first()
    # print(res.us.name)


    ### 反向查詢(母表查子表)
    ### obj.子表小寫.子表列名 : res.salary.money
    # res = models.UserInfo.objects.filter(name='zekai').first()
    # print(res.salary.money)


    return HttpResponse('ok')

多對多查詢

方法一

(先得到一個表中的對象,再反向查詢他們之間對應關系表中的對象,然后再正向查詢另一個表對象,或者對象中的屬性)
res = models.Boy.objects.filter(name='勾洋').first()
print(res) ### Boy object
 ### 反向查詢 love中的相親記錄
love_list = res.love_set.all() ## <QuerySet [<Love: Love object>, <Love: Love object>]>
for obj in love_list:
### 正向查詢 girl表中的nick
print(obj.g.nick)

方法二

先再兩表關聯表中查得到對象,再找另外一個表,但是查詢的關鍵字是用神奇的雙下畫線
res = models.Love.objects.filter(b__name='勾洋').all()
    # print(res) ## <QuerySet [<Love: Love object>, <Love: Love object>]>
    # for obj in res:
    #     print(obj.g.nick)

方法三

先再中間關聯表對象,其余兩表用神奇的雙下划線查

 ### 3.查詢和 勾洋 約會的 姑娘
    # res = models.Love.objects.filter(b__name='勾洋').values("g__nick")
    # print(res)

Django的增刪改查

增(add)

obj = models.Boy.objects.filter(name='謝增城').first()
print(obj)### Boy object
obj.g.add(3)
obj.g.add(*[1,2])

重置(set)

obj.g.set([4])

查詢(filter)

obj = models.Boy.objects.filter(name='謝增城').first()
    # res = obj.g.all()
    # print(res) ## <QuerySet [<Girl: Girl object>, <Girl: Girl object>, <Girl: Girl object>]>
    # for obj  in res:
    #     print(obj.nick)

obj = models.Boy.objects.filter(name='謝增城').first()
    obj.g.clear()

    return HttpResponse('ok')

其他查詢方法

查詢出的數據進行去重

user_obj.distinct()

in

res = models.UserInfo.objects.filter(id__in=[1,2,3])
    # print(res)

not in

res = models.UserInfo.objects.exclude(id__in=[1,2,3])
    # print(res)

like

where name like 'ze%' ## 以ze開頭的所有的數據
# startswith: 以 某單詞開頭
# istartswith : ignore (忽略)  以 某單詞開頭 忽略大小寫
res = models.UserInfo.objects.filter(name__startswith="ze")
res = models.UserInfo.objects.filter(name__istartswith="ze")
 where  name  like '%ze'
 endswith : 以 某個單詞結尾
 iendswith:  ignore (忽略)  以 某單詞結尾 忽略大小寫
res = models.UserInfo.objects.filter(name__endswith='ze')

where name like "%ze%"
 contains : 包含某一個單詞
icontains: 包含某一個單詞 不區分大小寫
models.UserInfo.objects.filter(name__contains='ze')

betwween......and

models.UserInfo.objects.filter(id__range=[1,2])

limit 10, 20

models.UserInfo.objects.all()[開始位置:結束位置]
models.UserInfo.objects.all()[0:10]
models.UserInfo.objects.all()[10:20]

order by /asc /desc

res = models.UserInfo.objects.all().order_by('id') ## 默認升序
 前面加一個 ‘-’ 代表 降序
 res = models.UserInfo.objects.all().order_by('-id','name')
 print(res.query

group by

from django.db.models import Count, Max, Min, Sum
    # res = models.UserInfo.objects.values('name').annotate(xxx=Count('id'))
    # print(res.query)
相當於
SELECT "app01_userinfo"."id", COUNT("app01_userinfo"."name") AS "xxx"
    # FROM "app01_userinfo"
    # GROUP BY "app01_userinfo"."id";

only: 只取某一個列的值

SELECT "app01_userinfo"."id", "app01_userinfo"."name", "app01_userinfo"."age" FROM "app01_userinfo"
res = models.UserInfo.objects.only('name',  'age').all()
print(res) ## <QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]>

defer: 除了這幾列之外的所有列的值

SELECT "app01_userinfo"."id", "app01_userinfo"."ut_id" FROM "app01_userinfo"
    # res = models.UserInfo.objects.defer('id','name', 'age').all()
    # print(res.query)(查看創建過程sql查詢語句)

using:

想要使用哪個數據庫, 就將這個數據庫的配置名稱寫到using中
models.UserInfo.objects.all().using("xxxx")

11. 表中總共多少條數據

res = models.UserInfo.objects.count()

12. 第一條數據

res = models.UserInfo.objects.first()

13.最后一條數據

res = models.UserInfo.objects.last()

14.gt lt范圍操作

res = models.UserInfo.objects.filter(id__gt=3)
res = models.UserInfo.objects.filter(id__gte=3)
res = models.UserInfo.objects.filter(id__lt=3)
res = models.UserInfo.objects.filter(id__lte=3)

15. and操作

res =  models.UserInfo.objects.filter(id=1, name='zekai')

16.or操作(導入Q)

from django.db.models import Q
    # res = models.UserInfo.objects.filter( Q(Q(id=1) | Q(name='zekai')) & Q(name='xxxx')  )

17. 在原來的基礎上更新值(導入F)

from django.db.models import F
models.UserInfo.objects.update(age = F('age') + 1)

18.原生sql

from django.db import  connection
cursor = connection.cursor()
cursor.execute("select * from app01_userinfo where id=%s", [1,])
res = cursor.fetchall()
res = cursor.fetchone()

19. 原生sql

models.UserInfo.objects.raw('select * from app01_userinfo')
 models.UserInfo.objects.filter(id=12).delete()
models.UserType.objects.filter(id=2).delete()

多條操作

e.增
### 插入一條數據
models.xxx.objects.create(name='xxx')
			
### 插入多條數據 
obj = [
	models.UserInfo(name='zekai', age=12,  ut_id=2),
	models.UserInfo(name='xxxxx', age=13,  ut_id=2),
	models.UserInfo(name='dsadsa', age=14,  ut_id=1),
	models.UserInfo(name='gfdgfdg', age=24,  ut_id=2),
	models.UserInfo(name='tretre', age=45,  ut_id=3),
	models.UserInfo(name='gfdgfd', age=42,  ut_id=2),
	]
	models.UserInfo.objects.bulk_create(obj)

f.刪
	models.xxxx.objects.all().delete()
	models.xxxx.objects.filter(name='kkk').delete()
			
g.改
models.userinfo.objects.filter(xxxx).update()

級聯刪除

ut = models.ForeignKey("UserType", null=True, on_delete=models.CASCADE)
CASCADE: 設置級聯刪除
SET_NULL : 取消級聯刪除
db_constraint=False,on_delete=models.CASCADE :取消物理外鍵,django外鍵不取消並設置級聯刪除

自己建表聯合唯一索引

models.py:
class Boy(models.Model):
name = models.CharField(max_length=32, null=True)

class Girl(models.Model):
nick = models.CharField(max_length=32, null=True)

class Love(models.Model):
    b = models.ForeignKey("Boy", null=True)
    g = models.ForeignKey("Girl", null=True)
							
	class Meta:
	unique_together = [
	('b',  'g')

Django建表生成第三張表·

通過 ManyToManyField() 來生成第三張表
models.py:
	class Boy(models.Model):
	name = models.CharField(max_length=32, null=True)
	g = models.ManyToManyField('Girl', null=True)

	class Girl(models.Model):
		nick = models.CharField(max_length=32, null=True)
views.py:
	### django
	### 添加
	obj = models.Boy.objects.filter(name='謝增城').first()
	# print(obj)### Boy object
	# obj.g.add(3)
	# obj.g.add(*[1,2])

	### 重置
	# obj.g.set([4])

	### 查詢
	# obj = models.Boy.objects.filter(name='謝增城').first()
	# res = obj.g.all()
	# print(res) ## <QuerySet [<Girl: Girl object>, <Girl: Girl object>, <Girl: Girl object>]>
	# for obj  in res:
	#     print(obj.nick)

	## 刪除
	obj = models.Boy.objects.filter(name='謝增城').first()
	obj.g.clear()

注意: ManyToManyField 只能生成兩個字段(boy_id 和 girl_id)根據自己的業務邏輯去寫

Xss攻擊

全程:跨站腳本(js)攻擊
			
原因:用戶輸入的內容不可控
				
<script>1.獲取用戶的cookie 2. 發送這個cookie到黑客的數據庫</script>
views.py:
						
msg = []
def comment(request):
if  request.method == 'GET':
	return render(request, "comment.html")
else:
	comment = request.POST.get('comment')
	msg.append(comment)
	return render(request, "comment.html")

def  show(request):
return render(request, 'show.html', {"msg":msg})
		
comment.html:
<form action="/comment/" method="post">
<input type="text" name="comment">
<input type="submit" value="提交">
</form>
		
show.html:
 <ul>
{% for item in msg %}
<li>{{ item | safe }}</li>
{% endfor %}
</ul>


免責聲明!

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



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