django_day05
django_day05
内容回顾
内容回顾
对应关系
类-------表
对象-----数据行
属性------字段
django使用mysql数据库流程
创建一个mysql数据库
在settings中配置数据库
- ENGINE mysql
- NAME 数据库名称
- HOST 127.0.0.1
- PORT 3306
- USER 用户名
- PASSWORD 密码
告诉django使用pymysql模块连接mysql模块
1. 写在与项目同名的目录下的__init__.py
2. import pymysql
3. pymysql.install_as_MySQLdb()
在app下的models.py中写类
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=32) #varchar(32)
执行数据库迁移的命令
python manage.py makemigrations
python manage.py migrate
常用字段
AutoField 自增字段 primary=True
CharField 字符串 max_length
BooleanField 布尔类型
IntegerField 整型 -21亿 --- +21亿 10位 不能存手机号
DateField
DateTimeField auto_now = True 新增和编辑时保存当前时间
auto_now_add = True 新增时保存当前的时间
TextField 文本类型字段的参数
null 数据库可以为空
blank 用户输入可以为空
unique 唯一约束
verbose_name 提示信息
choices 让用户选择的数据 choices=((1,'男'),(2,'女'))
default 默认值
db_column 列名
必知必会13条
返回对象列表
all 查询所有的数据
filter 查询所有满足条件的数据
exclude 查询所有不满足条件 的数据
values 查询数据的字段和值[ {} ]
values_list 查询数据的值 [()]
order_by 排序 默认升序 - 多字段排序age id
reverse 对已经排好序的queryset翻转
distinct 去重 返回对象
get 获取有且唯一的对象
first
last 返回布尔值
exists 数字
count
路由
url(r'^publisher_list/$',views.publisher_list)
url(r'^(publisher|book|author)_del/$',views.delete)
正则
\d \w + ? . *
r'^app01/publisher_list/$'
URL的命名和反向解析
静态路由
url(r'^publisher_list/$',views.publisher_list,name=pub)
模板中
'{% url 'pub' %}' --- '/publisher_list/'
py文件
from django.shotcuts import reverse
reverse('pub') --- '/publisher_list/'
分组
动态路由
url(r'^publisher_list/(\d+)/$',views.publisher_list,name=pub)
模板中
{% url 'pub' 5 %} '/publisher_list/5/'
py文件
from django.shotcuts import reverse
reverse('pub',args=(5,)) --- '/publisher_list/5/'
命名分组 可以按照命名传参
动态路由
url(r'^publisher_list/(?P<pk>\d+)/$',views.publisher_list,name=pub)
模板中
{% url 'pub' 5 %} '/publisher_list/5/'
{% url 'pub' pk=5 %} '/publisher_list/5/'
py文件
from django.shotcuts import reverse
reverse('pub',args=(5,)) --- '/publisher_list/5/'
reverse('pub',kwargs={'pk':'5'} --- '/publisher_list/6/'
外键
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup()
from app01 import models
#基于对象的查询
#正向查询
book_obj = models.Book.objects.get(pk=1)
# print(book_obj.pub) #关联的出版社对象
# print(book_obj.pub_id) #关联的出版社id
#反向查询
pub_obj = models.Publisher.objects.get(pk=1)
print(pub_obj)
# print(pub_obj.book_set,type(pub_obj.book_set)) #类名小写 set 关联所有对象
# print(pub_obj.book_set.all())
#指定related_name=‘books’
# print(pub_obj.books,type(pub_obj.books)) #类名小写 set 关联所有对象
# print(pub_obj.books.all())
#基于字段查询
ret = models.Book.objects.filter(pub__name__contains='出版社1')
# #不指定related_name='books'
# ret = models.Publisher.objects.filter(book__name='书1')
# #指定related__name='books' 不指定related_query_name='book'
# ret = models.Publisher.objects.filter(books__name='书1')
#指定related_query_name='book'
# ret = models.Publisher.objects.filter(book__name='书1')
# print(ret)
# set add create 只有对象 没有id
pub_obj.books.set(models.Book.objects.filter(id__in=[1,2]))
# remove clear 不能用
多对多
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup()
from app01 import models
author_obj = models.Author.objects.get(pk=1)
print(author_obj.books) #关系管理对象
print(author_obj.books.all()) #所关系对象集合
book_obj = models.Book.objects.get(pk=2)
# print(book_obj.author_set.all())
print(book_obj.authors.all())
# ret = models.Book.objects.filter(authors__name='李世林')
# ret = models.Author.objects.filter(books__name='书2')
#关系管理对象的方法
#all 查询所有的对象
#set 设置多对多 的关系 [id,id]
# author_obj.books.set([1,2])
#
# author_obj.books.set(models.Book.objects.filter(id__in=[3,4]))
#add 添加多对多关系
# author_obj.books.add(1,2)
# author_obj.books.add(*models.Book.objects.filter(id__in=[5,6]))#列表打散 变成对象
#remove 添加多对多的关系
# author_obj.books.remove(3,4)
# author_obj.books.remove(*models.Book.objects.filter(id__in=[5,6]))
#clear 清空多对多的关系
# author_obj.books.clear()
# create 新建一个对象和当前的对象建立关系
# author_obj.books.create(name='sdawd',pub_id='1')
ret= book_obj.authors.create(name='adadadfdcvxdc')
print(ret)
神奇的下划线
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup()
from app01 import models
ret = models.Person.objects.filter(pid__lt=5) #less than 小于
ret = models.Person.objects.filter(pid__gt=5) #greater than 大于
ret = models.Person.objects.filter(pid__lte=5) #less than equal 小于等于
ret = models.Person.objects.filter(pid__range=[1,6]) #左右都包含 范围
ret = models.Person.objects.filter(pid__in=[1,5,6]) #左右都包含 成员判断
ret = models.Person.objects.filter(name__contains='lsl') # like 模糊查询
ret = models.Person.objects.filter(name__icontains='lsl') # like 模糊查询 忽略大小写
ret = models.Person.objects.filter(name__startswith='l') # like 模糊查询 以什么开头
ret = models.Person.objects.filter(name__istartswith='l') # like 模糊查询 以什么开头 忽略大小写
# ret = models.Person.objects.filter(name__endwith='l') # like 模糊查询 以什么结尾
# ret = models.Person.objects.filter(name__iendwith='l') # like 模糊查询 以什么结尾 忽略大小写
ret = models.Person.objects.filter(birth__year='2020') # like 模糊查询 以什么结尾 忽略大小写
ret = models.Person.objects.filter(birth__month='1') # like 模糊查询 以什么结尾 忽略大小写
ret = models.Person.objects.filter(birth__day='1') # like 模糊查询 以什么结尾 忽略大小写
ret = models.Person.objects.filter(birth__contains='-02-') # like 模糊查询 以什么结尾 忽略大小写
ret = models.Person.objects.filter(name__isnull=True) #字段为空
print(ret)
聚合与分组
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup()
from app01 import models
from django.db.models import Avg, Sum, Max, Min, Count
#aggregate 终止子句
ret = models.Book.objects.all().aggregate(Avg("price"))# 返回字典 #{'price__avg': 205.483333}
ret = models.Book.objects.all().aggregate(average_price=Avg('price'))# 返回字典{'average_price': 205.483333}
ret = models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price"))# 返回字典{'price__avg': 205.483333, 'price__max': Decimal('999.00'), 'price__min': Decimal('9.90')}
ret = models.Book.objects.aggregate(Avg("price"), Max("price"), Min("price"))# 返回字典{'price__avg': 205.483333, 'price__max': Decimal('999.00'), 'price__min': Decimal('9.90')}
ret = models.Book.objects.filter(id__gt=2).aggregate(Avg("price"), Max("price"), Min("price"))# 返回字典{'price__avg': 205.483333, 'price__max': Decimal('999.00'), 'price__min': Decimal('9.90')}
print(ret)
#分组 group_by
#统计每一本书的作者个数
#annotate注释的意思 添加额外的信息
ret= models.Book.objects.annotate(Count('authors')).values()
for i in ret:
print(i)
##统计出每个出版社买的最便宜的书的价格
ret = models.Publisher.objects.annotate(Min('book__price')).values()
#按照pub_id pub_name分组
ret = models.Book.objects.values('pub','pub__name').annotate(Min('price'))
publisher_list = models.Publisher.objects.annotate(min_price=Min("book__price"))
for i in ret:
print(i)
#统计不止一个作者的图书
ret = models.Book.objects.annotate(count=Count('authors')).filter(count__gt=1)
print(ret)
#根据一本图书作者数量的多少对查询集 QuerySet进行排序
ret = models.Book.objects.annotate(count=Count('authors')).order_by('-count')
print(ret)
#查询各个作者出的书的总价格
ret = models.Author.objects.annotate(sum=Sum('books__price')).values()
ret = models.Book.objects.values('authors','authors__name').annotate(sum=Sum('price'))
for i in ret:
print(i)
F和Q
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup()
from app01 import models
from django.db.models import Avg, Sum, Max, Min, Count,F,Q
ret = models.Book.objects.filter(sale__gt=F('repertory')) #where 'sale' > 'repertory'
ret = models.Book.objects.filter(id__lte=3).update(sale=F('sale')*2 + 12)
ret = models.Book.objects.filter(Q(id__lt=3)|Q(id__gt=5)) #或者的关系
ret = models.Book.objects.filter(Q(Q(id__lt=3)|Q(id__gt=5))&Q(name__startswith='lsl')) #与的关系
# ret = models.Book.objects.exclude(id__gte=3,id__lte=5)
"""
Q()
| 或者
& 并且
~ 非
"""
print(ret)
事务
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "about_orm.settings")
import django
django.setup()
from app01 import models
from django.db.models import Avg, Sum, Max, Min, Count,F,Q
from django.db import transaction
try:
with transaction.atomic():
#一系列的操作
models.Book.objects.all().update(repertory=F('repertory') - 10)
int('sss')
models.Book.objects.all().update(sale=F('sale') + 10)
except Exception as e:
print(e)
cookie
保存在浏览器本地上的一组组键值对
特性:
- 由服务器让浏览器进行设置的
- cookie信息保存在本地浏览器 有权不保存
- 浏览器再次访问时自动携带对应的cookie
django中操作cookie
#设置cookie
request.set_cookie(key,value) # Set-Cookie: is_login=1
response.set_signed_cookie(key, value,salt='s28')#加密cookie #获取
request.COOKIES.get(key)#请求头 Cookie : is_login = 1;
request.get_signed_cookie(key,salt='s28',default='')#加密cookie #删除cookie 设置cookie值为空 超时时间为0
response.delete_cookie(key)
参数
- key, 键
- value='', 值
- max_age=None, 超时时间
- expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
- path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问
- domain=None, Cookie生效的域名
- secure=False, https传输
- httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
django_day05的更多相关文章
随机推荐
- SQLite数据库损坏及其修复探究
数据库如何发生损坏 SQLite 数据库具有很强的抗损坏能力.在执行事务时如果发生应用程序崩溃.操作系统崩溃甚至电源故障,那么在下次访问数据库文件时,会自动回滚部分写入的事务.恢复过程是全自动的, ...
- 自己封装的tools.js文件
/* * 生成指定范围的随机整数 * @param lower 下限 * @param upper 上限 * @return 返回指定范围的随机整数,上/下限值均可取 */ function rand ...
- SAP ABAP 快速入门之 开发环境 (Environment)
报表是学习ABAP 原则和工具的很好的 起点.ABAP 报表在许多领域都有使用,本章将介绍简单ABAP 报表的开发. Hello ABAP 让我们以'Hello World' 开始. 每一个abap ...
- Volcano成Spark默认batch调度器
摘要:对于Spark用户而言,借助Volcano提供的批量调度.细粒度资源管理等功能,可以更便捷的从Hadoop迁移到Kubernetes,同时大幅提升大规模数据分析业务的性能. 2022年6月16日 ...
- 网络通讯之Socket-Tcp(一)
网络通讯之Socket-Tcp 分成3部分讲解: 网络通讯之Socket-Tcp(一): 1.如何理解Socket 2.Socket通信重要函数 网络通讯之Socket-Tcp(二): 1.简单So ...
- 讲给测试人员的docker知识
docker对测试来说有什么用 docker类似于Windows系统的虚拟机,对于测试来说docker意味着一种新的测试环境部署方式,由于其镜像分层的设置,我们可以在一台物理机上同过docker的方式 ...
- RS485通信电路
RS485由RS232和RS422发展而来,弥补了抗干扰能力差.通信距离短.速率低的缺点,增加了多点.双向通信能力,即允许多个发送器连接在同一条主线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了 ...
- 事务@Transactional注解的属性
事务的传播行为 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行.事务的传播行为可以由传播属性指定.Sprin ...
- springboot2+jpa+oracle实例
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...
- Active Backup for Business激活
依次执行 https://IP地址:5001/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=1&account= ...