model(数据库模型)------ ORM(object relation mapping)
1.仅限Django 自带2.orm可以避免新手写sql语句带来的性能问题
3.orm搬迁是非常容易的 调换数据库容易不需要改代码
1.通过pymysql(原生sql)
2.orm-通过类的实例来进行与数据库交互 (一个类为表,一个实例就是一个记录,
属性为表中数据)
Django配置mysql
1. settings.py :把原来的 DATABASES 隐藏
DATABASES = {
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':'' #数据库名称
'USER':'root' #用户名
'PASSWORD':'' #数据库密码
'HOST': '' #主机,默认为localhost
'PORT':'3306' #端口
}
}
2. 在项目__init__.py 中添加:
import pymysql
pymysql.install_as_MySQLdb()
3. 在app包下models.py创建表
必须继承(models.Model)
class Book(models.Model):
name = models.CharField(max_length=20) // CharField字符串类型
price = models.IntegerField() // IntegerField 整数
pub_date = models.DateField() // DateField 时间类型
获取字段
b = Book()
b.id
4. 运行命令
python manage.py makemigrations (在migrations包下出现0001_initial.py 文件)
python manage.py migrate (生成很多张表默认创建一些表)
表名 == 项目名加表名
=======查看表记录翻译为sql语句 可以在settings.py 文件中添加LOGGING
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
惰性求值
Publish.objects.all() 或者 .frlter() 等都只是返回了一个 QuerySet(查询结果集对象)并不会马上执行sql,而是等到调用 QuerySet的时候才会执行
QuerySet 可迭代 可切片
把 QuerySet对象变为 可迭代对象 .iterator() 迭代器只能取一遍
ret = Publish.objects.all().iterator()
for i in ret:
print(i)
单表操作
表记录操作
1. 引入到视图views.py中 import app01.models import *注意:前端input传过来的name值和用户输入值,写入数据库的是字典(**dic)
第一种添加:
def add(req):
b = Book(name='qq',price=10,pub_date='2011-1-1')
b.save()
return HttpResponse('添加成功')
第二种添加:(不用关闭)
def add(req):
Book.objects.create(name='qq',price=10,pub_date='2011-1-1')
return HttpResponse('添加成功')
第一种替换:
def update(req):
b = Book.objects.get(name='qq') # get 返回的是实例对象
#print(b) # QuerySet 对象集合
b.price = 99
b.save()
return HttpResponse('修改成功')
**建议使用 update效率更高
第二种替换:(不用关闭)
def update(req):
Book.objects.filter(name='qq').update(price=99) # update是uerySet对象
return HttpResponse('修改成功')
删除:
def dele(req):
Book.objects.filter(name='qq').delete()
return HttpResponse('删除成功')
查询:
def select(req):***book_list = Book.objects.all() # 可以进行切片 取几条
book_list = Book.objects.all()[::2]
book_list = Book.objects.first() # 第一个
book_list = Book.objects.last() # 最后一个
book_list = Book.objects.get(id=1) # 只有是一条的才会查询出来 否则会报错
**book_list = Book.objects.filter(name='q').values('price') # 取出name为q的price 返回字典类型
book_list = Book.objects.filter(name='q').values('price','pub_date') # 取出name为q的 两个属性
book_list = Book.objects.filter(name='q').values_list('price') # 返回列表类型没有键
book_list = Book.objects.exclude(name='q') # 取反 取name为q的 其他值
return reder(req,'index.html',{'book_list':book_list})
order_by 对查询结果排序
reverse 反转 对查询结果反向排序
****Book.objects.all().values('name').distinct() 从返回结果中剔除重复记录
values_list 返回元组 values返回字典
count 返回数据库中匹配查询的对象数量
exists 如果QuerySet包含数据 就返回True,否则返回False
模糊查询:
万能的双下划线 __Book.objects.filter(price__gt=50).values('name','price')
查询price小于50的
Book.objects.filter(name__icontanins="P").values('name','price')
加i不区分大小写 查询name包含P的
__lt 大于
Book.objects.filter(id__in[1,2,3]) id 等于1,2,3 的值
range=[1,2] 范围
startwith istartwith 以什么开头
endswith iendswith 以什么结尾
模版语言取不到的不报错 只是不显示
HTML循环:
{% for book in book_list %}
{{ book.name }} {{ book.price }}
{% endfor %}
多关键字查询
F查询 Q查询
from django.db.models import Q,F只能满足且的操作 and
Book.objects.get(price=77) 只能根据一个关键字查询
F查询: 查询对象多个内容
Book.objects.all().update(price=F('price')+10)
Q查询:可以添加多个条件
Book.objects.filter(Q(name='q'))
或(|) 非(^)
Book.objects.filter(Q(name='q'),Q(name='w'))Book.objects.filter(Q(name='q')|Q(name='w'))