djano一對(duì)一、多對(duì)多、分頁(yè)實(shí)例代碼
昨日內(nèi)容:
ORM高級(jí)查詢
-filter
id=3
id__gt=3
id__lt=3
id__lte=3
id__gte=3
-in /not in
.filter(id__in=[]) in
.exclude(id__in=[]) not in
-between......and
.filter(id__range=[])
-like
.filter(name__startswith='XX') like 'XX%'
.filter(name_istartswith='XX') #忽略大小寫
.filter(name__endswith='XX') like'%XX'
.filter(name__contains='XX') like'%XX%'
.filter(name_regax='^XX$') like'%XX%'精準(zhǔn)匹配
-or
from django.db.models import Q
Q和|連用為or
&為and
-order by
models.UserInfo.objects.all().order_by('id')#升序#('-id')則為降序
#若有2個(gè)值,則第一個(gè)先排序,第二個(gè)后排序
-group by
from django.db.models import Sum,Count,Min,Max
models.UserInfo.objects.values('name').annota1te(xx=Sum('age'))
models.UserInfo.objects.values('name').annota1te(xx=Sum('age')).filter(XX__gt=50)#二次篩選
-count
models.UserInfo.objects.count()
-limit分頁(yè)
models.UserInfo.objects.all()[X,XX]#利用切分來分頁(yè)
-distinct
models.UserInfo.objects.values('XX').distinct()
-原生SQL
from django.db import connection
-first
-last兩個(gè)返回的都是對(duì)象
-only
返回值為列表里面套對(duì)象
-defer
除了某一列以外的其他對(duì)象,返回值為列表套對(duì)象、
-F
拿到某一列的值,但是只能進(jìn)行數(shù)組操作
XSS -跨腳本(js)攻擊
原因: 服務(wù)端太相信客戶端傳過來的參數(shù)
防止: 對(duì)客戶端傳過來的數(shù)據(jù)統(tǒng)一進(jìn)行轉(zhuǎn)譯
django中自帶轉(zhuǎn)譯 消除django中的轉(zhuǎn)譯 {{name|safe}} safe為相信
今日內(nèi)容:
一對(duì)一
母表:userinfo
id name age 1 zekai 18 2 lxxx 58 private: id salary sp_id(外鍵+unique) 1 5000 1 2 4000 2
一對(duì)一
OneToOneField("表名",null=True)默認(rèn)要求該字段必須是唯一的unique外鍵關(guān)系
#從母表查詢子表的數(shù)據(jù)
查詢一下name='zekai'的這條數(shù)據(jù)
res = models.UserInfo.objects.filter(name='zekai').first() print(res.private.salary) #res.子表表名小寫.子表字段名
#從字表查詢母表中的數(shù)據(jù)
查詢salary=5000的這個(gè)數(shù)據(jù)所對(duì)應(yīng)的用戶的信息
res= models.Private.objects.filter(salary=5000).first() print(res.sp.name,res.sp.age) #res.關(guān)聯(lián)的字段名.母表字段名
多對(duì)多
相親模型
boy:
id name
1 laowang
2 XXX
girl:
id name
1 正正
2 連連
3 愛愛
4 鳳姐
5 喬碧蘿
boy2girl
id bid gid
1 1 1
2 1 2
3 1 3
4 2 2
5 2 4
6 2 5
models.py:
class Boy(models.Model):
bname=models.CharField(max_length=32,null=True)
class Girl(models.Model):
gname=models.CharField(max_length=32,null=True)
class Boy2Girl(models.Model):
b = models.ForeignKey("Boy",null=True)
g = models.ForeignKey("Girl",null=True)
#聯(lián)合唯一索引
class Meta:
unique_together=[
('b','g')
]
views.py:
def test1(rsquest):
boyinfo= [
models.Boy(bname='雷俊'),
models.Boy(bname='雷鳴'),
models.Boy(bname='雷公'),
models.Boy(bname='雷軍'),
models.Boy(bname='雷峰'),
]
girlinfo=[
models.Girl(gname='真真'),
models.Girl(gname='天天'),
models.Girl(gname='愛愛'),
models.Girl(gname='鳳姐'),
models.Girl(gname='喬碧蘿'),
]
models.Girl.objects.bulk_create(boyinfo)
b2ginfo=[
models.Boy2Girl(b_id=1,g_id=1),
models.Boy2Girl(b_id=2, g_id=4),
models.Boy2Girl(b_id=3, g_id=3),
models.Boy2Girl(b_id=4, g_id=5),
models.Boy2Girl(b_id=5, g_id=2),
models.Boy2Girl(b_id=3, g_id=5),
models.Boy2Girl(b_id=5, g_id=4),
]
return HttpResponse('ok')
查詢:需求,查找和雷俊約會(huì)的姑娘
res = models.Boy2Girl.objects.filter(bname='雷俊').first()
love_list = res.boy2girl_set.all()
for love in love_list:
print(love.g.name)
res = models.Boy2Girl.objects.filter(b__bname='雷俊') #[obj,obj...]
for love in res:
print(res.g.name)
res = models.Boy2Girl.objects.filter(b__bname='雷俊').values('g__gname')
print(res) # [{},{}...]
第一種方式:手動(dòng)創(chuàng)建第三張表
models.py
views.py
第二種方式:manytomanyfield
models.py
view.py
區(qū)別:
第一種方式比較靈活
第二種方式比較死板但是如果將來業(yè)務(wù)擴(kuò)展的時(shí)候,就需要重新打破重來
因此推薦使用第一種,自定義創(chuàng)建第三張表
表中數(shù)據(jù)類型
-mysql
-django admin
| mysql | django | |
|---|---|---|
| 數(shù)字 | tinyint | 不存在 |
| smallint | SmallInterField | |
| mediumint | 不存在 | |
| int | integerFieled/PositiveIntegerField | |
| bignt | BigInterField/PositiveBigIntegerField | |
| decimal | DecimalField | |
| float | FloatField | |
| double | 不存在 |
| mysql | django | |
|---|---|---|
| 字符串 | char | 不存在 |
| varchar | CharField | |
| text | TextField | |
| 時(shí)間日期 | date | DateField |
| datetime | DatetimeField | |
參數(shù):
null 數(shù)據(jù)庫(kù)中字符段是否為空
db_column:數(shù)據(jù)庫(kù)中字段的列名
default:數(shù)據(jù)庫(kù)中字段的默認(rèn)值
primary_key:字段是否為主鍵
unique_together :聯(lián)合唯一索引
index_together:聯(lián)合索引
db_index:數(shù)據(jù)庫(kù)中字段是否可以建立索引
unique:數(shù)據(jù)庫(kù)中字段是否可以建立唯一索引
分頁(yè)
-內(nèi)置分頁(yè)
from django.core.paginator import Paginator
#per_page:每頁(yè)顯示條目數(shù)量
#count:數(shù)據(jù)總個(gè)數(shù)
#num_pages:總頁(yè)數(shù)
#page_range:總頁(yè)數(shù)的索引范圍
#page:page對(duì)象
paginator = Paginator(userlist,10)
#has_next:是否有下一頁(yè)
#next_page_number:下一頁(yè)頁(yè)碼
#has_previous:是否有上一頁(yè)
#previous_page_number:上一頁(yè)頁(yè)碼
#object_list:分頁(yè)之后的數(shù)據(jù)列表
#number:當(dāng)前頁(yè)
#paginator:paginator對(duì)象
sers = paginator.page(cur_page)
return render(request,'index.html',{"users":users})
-自定制分頁(yè)
class PageInfo():
def __init__(self, cur_page, total, per_page=10, show_page=11):
self.cur_page = cur_page
self.per_page = per_page
self.total = total
self.show_page = show_page
a, b = divmod(self.total, self.per_page)
if b:
a = a + 1
self.total_page = a #### 總頁(yè)數(shù)
#### 獲取起始索引
def get_start(self):
start = (self.cur_page - 1) * self.per_page
return start
#### 獲取結(jié)束索引
def get_end(self):
return self.cur_page * self.per_page
def get_page(self):
half = (self.show_page - 1) // 2
#### taotal_page = 5 < show_page = 11
if self.total_page < self.show_page:
begin = 1
end = self.total_page
else:
#### 左邊極值判斷
if self.cur_page - half <= 0 :
begin = 1
# end = self.cur_page + half
end = self.show_page
#### 右邊極值的判斷
elif self.cur_page + half > self.total_page:
# begin = self.cur_page - half
begin = self.total_page - self.show_page + 1
end = self.total_page ### 31
#### 正常頁(yè)碼判斷
else:
begin = self.cur_page - half
end = self.cur_page + half
page_list = []
if self.cur_page == 1:
astr = "<li><a href='#' aria-label='Previous'><span aria-hidden='true'>«</span></a></li>"
else:
astr = "<li><a href='/custom/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>«</span></a></li>" % (self.cur_page-1)
page_list.append(astr)
for i in range(begin, end + 1):
if self.cur_page == i:
# astr = "<a style='display:inline-block; padding:5px;margin:5px;background-color:red;' href='/custom/?cur_page=%s'>%s</a>" % (i, i)
astr = "<li class='active'><a href='/custom/?cur_page=%s'>%s</a></li>" % (i, i)
else:
# astr = "<a style='display:inline-block; padding:5px;margin:5px' href='/custom/?cur_page=%s'>%s</a>" % (i, i)
astr = "<li><a href='/custom/?cur_page=%s'>%s</a></li>" % (i, i)
page_list.append(astr)
if self.cur_page == self.total_page:
astr = "<li><a href='#' aria-label='Next'><span aria-hidden='true'>»</span></a></li>"
else:
astr = "<li><a href='/custom/?cur_page=%s' aria-label='Next'><span aria-hidden='true'>»</span></a></li>" % (self.cur_page+1)
page_list.append(astr)
s = " ".join(page_list)
return s
def custom(request):
cur_page = request.GET.get('cur_page')
cur_page = int(cur_page)
'''
mysql:
seelct * from userinfo limit 0, 10
seelct * from userinfo limit 10, 10
cur_page start show_page
1 0 10
2 10 10
3 20 10
n (n-1)*10, 10
limit (cur_page - 1) * show_page
'''
# total = models.UserInfo.objects.count()
total = models.UserInfo.objects.filter(id__lte=44).count()
page = PageInfo(cur_page, total)
start = page.get_start()
end = page.get_end()
### cur_page = 1 start = 0 end = 10
### cur_page = 2 start = 10 end = 20
### cur_page = 3 start =20 end = 30
# user_list = models.UserInfo.objects.all()[start:end]
user_list = models.UserInfo.objects.filter(id__lte=44)[start:end]
return render(request, "custom.html", {"user_list":user_list, "page":page})
安全攻擊
- -XSS
- -csrf
- -sql注入
以上就是本次介紹的全部相關(guān)知識(shí)點(diǎn),感謝大家對(duì)腳本之家的支持。
相關(guān)文章
Python Joblib庫(kù)使用方法案例總結(jié)
Python Joblib庫(kù)是一個(gè)用于并行計(jì)算和數(shù)據(jù)預(yù)處理的工具庫(kù)。它可以幫助用戶快速處理大量數(shù)據(jù),提高計(jì)算效率。其中,最常用的功能是并行計(jì)算,可以使用多個(gè)CPU核心同時(shí)處理任務(wù),大大縮短計(jì)算時(shí)間。此外,Joblib還提供了一些數(shù)據(jù)預(yù)處理的功能,可以幫助用戶更好地處理數(shù)據(jù)2023-06-06
詳解Django之a(chǎn)uth模塊(用戶認(rèn)證)
這篇文章主要介紹了詳解Django之a(chǎn)uth模塊(用戶認(rèn)證),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例
大家好,本篇文章主要講的是用Python爬取英雄聯(lián)盟的皮膚詳細(xì)示例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
Python關(guān)于拓?fù)渑判蛑R(shí)點(diǎn)講解
在本篇文章里小編給大家分享了一篇關(guān)于Python關(guān)于拓?fù)渑判蛑R(shí)點(diǎn)講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01
python中的import、from import及import as的區(qū)別解析
在Python中,如果import的語(yǔ)句比較長(zhǎng),導(dǎo)致后續(xù)引用不方便,可以使用as語(yǔ)法,這篇文章主要介紹了python中的import、from import以及import as的區(qū)別,需要的朋友可以參考下2022-10-10
使用python下載大型文件顯示進(jìn)度條和下載時(shí)間的操作代碼
大家都知道下載大型文件時(shí)存在一個(gè)問題,那就是內(nèi)存使用量迅速上升,可能會(huì)造成電腦卡死,所以我們需要換一個(gè)方式進(jìn)行下載,這篇文章主要介紹了使用python下載大型文件的方法顯示進(jìn)度條和下載時(shí)間,需要的朋友可以參考下2022-11-11
python自動(dòng)化測(cè)試無法啟動(dòng)谷歌瀏覽器問題
這篇文章主要介紹了python自動(dòng)化測(cè)試無法啟動(dòng)谷歌瀏覽器問題,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
OpenCV-Python實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù)
本文將結(jié)合實(shí)例代碼,介紹OpenCV-Python實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù),包含開運(yùn)算,閉運(yùn)算等復(fù)雜的形態(tài)學(xué)運(yùn)算,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06
Pandas_cum累積計(jì)算和rolling滾動(dòng)計(jì)算的用法詳解
今天小編就為大家分享一篇Pandas_cum累積計(jì)算和rolling滾動(dòng)計(jì)算的用法詳解,具有好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
python?Pandas庫(kù)read_excel()參數(shù)實(shí)例詳解
人們經(jīng)常用pandas處理表格型數(shù)據(jù),時(shí)常需要讀入excel表格數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python?Pandas庫(kù)read_excel()參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

