djano一对一、多对多、分页实例代码
昨日内容:
ORM高级查询
-filterid=3id__gt=3id__lt=3id__lte=3id__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%'精准匹配-orfrom django.db.models import QQ和|连用为or&为and-order bymodels.UserInfo.objects.all().order_by('id')#升序#('-id')则为降序#若有2个值,则第一个先排序,第二个后排序-group byfrom django.db.models import Sum,Count,Min,Maxmodels.UserInfo.objects.values('name').annota1te(xx=Sum('age'))models.UserInfo.objects.values('name').annota1te(xx=Sum('age')).filter(XX__gt=50)#二次筛选-countmodels.UserInfo.objects.count()-limit分页models.UserInfo.objects.all()[X,XX]#利用切分来分页-distinctmodels.UserInfo.objects.values('XX').distinct()-原生SQLfrom django.db import connection-first-last两个返回的都是对象-only返回值为列表里面套对象-defer除了某一列以外的其他对象,返回值为列表套对象、-F拿到某一列的值,但是只能进行数组操作
XSS -跨脚本(js)攻击
原因: 服务端太相信客户端传过来的参数
防止: 对客户端传过来的数据统一进行转译
django中自带转译 消除django中的转译 {{name|safe}} safe为相信
今日内容:
一对一
母表:userinfo
id name age1 zekai 182 lxxx 58private:id salary sp_id(外键+unique)1 5000 12 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 name1 laowang2 XXXgirl:id name1 正正2 连连3 爱爱4 凤姐5 乔碧萝boy2girlid bid gid1 1 12 1 2 3 1 34 2 25 2 46 2 5models.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
mysql django 数字 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
参数:
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'>«</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 sdef 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注入以上就是本次介绍的全部相关知识点,感谢大家对亿速云的支持。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。