您好,登錄后才能下訂單哦!
昨日內(nèi)容:
ORM高級查詢
-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個值,則第一個先排序,第二個后排序 -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分頁 models.UserInfo.objects.all()[X,XX]#利用切分來分頁 -distinct models.UserInfo.objects.values('XX').distinct() -原生SQL from django.db import connection -first -last兩個返回的都是對象 -only 返回值為列表里面套對象 -defer 除了某一列以外的其他對象,返回值為列表套對象、 -F 拿到某一列的值,但是只能進(jìn)行數(shù)組操作
XSS -跨腳本(js)攻擊
原因: 服務(wù)端太相信客戶端傳過來的參數(shù)
防止: 對客戶端傳過來的數(shù)據(jù)統(tǒng)一進(jìn)行轉(zhuǎn)譯
django中自帶轉(zhuǎn)譯 消除django中的轉(zhuǎn)譯 {{name|safe}} safe為相信
今日內(nèi)容:
一對一
母表:userinfo
id name age 1 zekai 18 2 lxxx 58 private: id salary sp_id(外鍵+unique) 1 5000 1 2 4000 2
一對一
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的這個數(shù)據(jù)所對應(yīng)的用戶的信息
res= models.Private.objects.filter(salary=5000).first() print(res.sp.name,res.sp.age) #res.關(guān)聯(lián)的字段名.母表字段名
多對多
相親模型
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') 查詢:需求,查找和雷俊約會的姑娘 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) # [{},{}...]
第一種方式:手動創(chuàng)建第三張表
models.py
views.py
第二種方式:manytomanyfield
models.py
view.py
區(qū)別:
第一種方式比較靈活
第二種方式比較死板但是如果將來業(yè)務(wù)擴(kuò)展的時候,就需要重新打破重來
因此推薦使用第一種,自定義創(chuàng)建第三張表
表中數(shù)據(jù)類型
-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 | |
時間日期 | date | DateField |
datetime | DatetimeField | |
參數(shù):
null 數(shù)據(jù)庫中字符段是否為空
db_column:數(shù)據(jù)庫中字段的列名
default:數(shù)據(jù)庫中字段的默認(rèn)值
primary_key:字段是否為主鍵
unique_together :聯(lián)合唯一索引
index_together:聯(lián)合索引
db_index:數(shù)據(jù)庫中字段是否可以建立索引
unique:數(shù)據(jù)庫中字段是否可以建立唯一索引
分頁
-內(nèi)置分頁
from django.core.paginator import Paginator #per_page:每頁顯示條目數(shù)量 #count:數(shù)據(jù)總個數(shù) #num_pages:總頁數(shù) #page_range:總頁數(shù)的索引范圍 #page:page對象 paginator = Paginator(userlist,10) #has_next:是否有下一頁 #next_page_number:下一頁頁碼 #has_previous:是否有上一頁 #previous_page_number:上一頁頁碼 #object_list:分頁之后的數(shù)據(jù)列表 #number:當(dāng)前頁 #paginator:paginator對象 sers = paginator.page(cur_page) return render(request,'index.html',{"users":users}) -自定制分頁 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 #### 總頁數(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 #### 正常頁碼判斷 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})
安全攻擊
以上就是本次介紹的全部相關(guān)知識點(diǎn),感謝大家對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。