djano一对一、多对多、分页实例代码
作者:蜗牛少少 发布时间:2022-11-06 23:05:44
标签: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
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 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注入
来源:https://www.cnblogs.com/zrx19960128/p/11361105.html
0
投稿
猜你喜欢
- 分享两个常用的代码生成工具:gormgenhandlergengormgen基于 MySQL 数据表结构进行生成 3 个文件:生成表的 st
- 用Python实现出来的机器学习算法都是什么样子呢? 前两期线性回归及逻辑回归项目已发布(见文末链接),今天来讲讲BP神经网络。BP神经网络
- 适配器模式适配器是一种结构型设计模式, 它能使不兼容的对象能够相互合作。适配器可担任两个对象间的封装器, 它会接收对于一个对象的调用, 并将
- 前言matplotlib实际上是一套面向对象的绘图库,它所绘制的图表中的每个绘图元素,例如线条Line2D、文字Text、刻度等在内存中都有
- 1. 字符编码简介1.1. ASCIIASCII(American Standard Code for Information Interc
- 原始结构:Column1 Column2----------- ----------1 A1 B2 C2 D2 E3 F查询效果:Colum
- 你一定很喜欢像QQ或者MSN好友登录提示的效果吧,那么怎么样能在网页中实现呢?asp之家为大家找到了这
- Go 编写定时器和定时任务在 项目开发当中,可能会遇到这样的场景:1 A任务需要在多久之后执行一次(定时器)2.B任务需要每隔多长时间执行一
- 本文实例讲述了mysql外键的三种关系。分享给大家供大家参考,具体如下:因为有foreign key的约束,使得两张表形成了三种了关系:多对
- Saver的用法1. Saver的背景介绍我们经常在训练完一个模型之后希望保存训练的结果,这些结果指的是模型的参数,以便下次迭代的训练或者用
- 本文将教会我们如何使用PyQt5控件的工具提示功能。#!/usr/bin/python3# -*- coding: utf-8 -*-&qu
- 本文实例为大家分享了python实现大量图片重命名的具体代码,供大家参考,具体内容如下说明在进行深度学习的过程中,需要对图片进行批量的命名处
- 1: 更新代码时, 监测到本地代码改变,需要和合并,重启之后才可以, 选择No同时,代码会被冲掉,新增加的文件也会被冲掉, 但是pychar
- 前言提示:以下是本篇文章正文内容🧡基本概念🌳树的定义树是n(n≥0)个结点的有限集合,n = 0时,称为空树,这是一种特殊情况在任意一棵非空
- 本文实例讲述了Python记录详细调用堆栈日志的方法。分享给大家供大家参考。具体实现方法如下:import sysimport osdef
- Vuex getters动态获取state的值在做项目时,getters里有很多冗余代码,但是仔细一看可以根据参数来解决,于是决定使用传参来
- 今日上课,有位同学问到:w和w+有何区别呢。说实话,我们经常只是用一种权限,没用在意之间的区别,实际上,w+具有可读可写权限,而w只有可写权
- 本文实例讲述了python中urllib模块用法。分享给大家供大家参考。具体分析如下:一、问题:近期公司项目的需求是根据客户提供的api,我
- linux环境Mysql 5.7.13安装教程分享给大家,供大家参考,具体内容如下1系统约定安装文件下载目录:/data/softwareM
- 常见的几种分页方式:1.扶梯方式扶梯方式在导航上通常只提供上一页/下一页这两种模式,部分产品甚至不提供上一页功能,只提供一种“更多/more