djano一对一、多对多、分页实例代码

昨日内容:

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%'精准匹配

-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

拿到某一列的值,但是只能进行数组操作

XSS -跨脚本(js)攻击

原因: 服务端太相信客户端传过来的参数

防止: 对客户端传过来的数据统一进行转译

django中自带转译 ​ 消除django中的转译 {{name|safe}} safe为相信

今日内容:

一对一

母表: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)默认要求该字段必须是唯一的unique外键关系

#从母表查询子表的数据

查询一下name='zekai'的这条数据

res = models.UserInfo.objects.filter(name='zekai').first()

print(res.private.salary)

#res.子表表名小写.子表字段名

#从字表查询母表中的数据

查询salary=5000的这个数据所对应的用户的信息

res= models.Private.objects.filter(salary=5000).first()

print(res.sp.name,res.sp.age)

#res.关联的字段名.母表字段名

多对多

相亲模型

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)

#联合唯一索引

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) # [{},{}...]

第一种方式:手动创建第三张表

models.py

views.py

第二种方式:manytomanyfield

models.py

view.py

区别:

第一种方式比较灵活

第二种方式比较死板但是如果将来业务扩展的时候,就需要重新打破重来

因此推荐使用第一种,自定义创建第三张表

表中数据类型

-mysql

-django admin

 mysqldjango
数字tinyint不存在
 smallintSmallInterField
 mediumint不存在
 intintegerFieled/PositiveIntegerField
 bigntBigInterField/PositiveBigIntegerField
 decimalDecimalField
 floatFloatField
 double不存在

 mysqldjango
字符串char不存在
 varcharCharField
 textTextField
时间日期dateDateField
 datetimeDatetimeField
   

参数:

null 数据库中字符段是否为空

db_column:数据库中字段的列名

default:数据库中字段的默认值

primary_key:字段是否为主键

unique_together :联合唯一索引

index_together:联合索引

db_index:数据库中字段是否可以建立索引

unique:数据库中字段是否可以建立唯一索引

分页

-内置分页

from django.core.paginator import Paginator

#per_page:每页显示条目数量

#count:数据总个数

#num_pages:总页数

#page_range:总页数的索引范围

#page:page对象

paginator = Paginator(userlist,10)

#has_next:是否有下一页

#next_page_number:下一页页码

#has_previous:是否有上一页

#previous_page_number:上一页页码

#object_list:分页之后的数据列表

#number:当前页

#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 #### 总页数

#### 获取起始索引

def get_start(self):

start = (self.cur_page - 1) * self.per_page

return start

#### 获取结束索引

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'>&laquo;</span></a></li>"

else:

astr = "<li><a href='/custom/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>&laquo;</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'>&raquo;</span></a></li>"

else:

astr = "<li><a href='/custom/?cur_page=%s' aria-label='Next'><span aria-hidden='true'>&raquo;</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注入

以上是 djano一对一、多对多、分页实例代码 的全部内容, 来源链接: utcz.com/z/332587.html

回到顶部