发布时间:2018-06-28 15:18:58编辑:Run阅读(5234)
Django--ORM单表操作
创建一个新的django项目
项目目录结构:
Django连接数据库配置
重点:
第一步:
修改settings.py文件
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 数据库引擎,使用的是mysql 'NAME': 'day71', # 数据库名 'USER': 'django123', # 账号 'PASSWORD': 'django123', # 密码 'HOST': '192.168.11.106', # ip地址 'PORT': 3306, # 端口 } }
第二步:
修改models.py文件,创建表结构
from django.db import models # Create your models here. class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) pub_date = models.DateField() price = models.DecimalField(max_digits=8, decimal_places=2) publish = models.CharField(max_length=32)
第三步:
在settings.py同目录找到__init__.py文件,添加
注意:如果pymysql没有安装,先pip3 install pymsyql
import pymysql pymysql.install_as_MySQLdb()
最后,点击Tools里面的,Run manage.py Task...
先运行
makemigrations
它的作用相当于 在该app下建立 migrations目录,并记录下你所有的关于modes.py的改动,比如0001_initial.py, 但是这个改动还没有作用到数据库文件
Migrations for 'app01':
app01\migrations\0001_initial.py
- Create model Book
再运行
migrate
它是将该改动作用到数据库文件,比如创建表,修改表字段之类的操作
Operations to perform:
Apply all migrations: admin, app01, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying app01.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
执行完后,可以用pycharm自带的mysql连接工具测试
表已经成功创建
django-ORM插入一条数据
更改urls.py文件,添加一个路径add
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('add/', views.add), ]
更改views.py文件
from django.shortcuts import render,HttpResponse from app01.models import Book # Create your views here. def add(request): # 实例化一个对象,并传参 book = Book(title='西游记', price="88.88", pub_date="2013-12-12", publish='第一出版社') book.save() # 这种方法必须要save(),不然数据不会保存 return HttpResponse('添加成功')
启动项目:
访问
http://127.0.0.1:8000/add/
刷新数据库看看
第二种方法:推荐使用
objects: 表示管理器
book.objects : 管理book表
create: 添加
from django.shortcuts import render,HttpResponse from app01.models import Book # Create your views here. def add(request): book_obj = Book.objects.create(title='红楼梦', price="66.66", pub_date="2014-08-22", publish='第二出版社') print(book_obj) # 返回一个对象,包含记录的所有信息 print(book_obj.title) print(book_obj.price) print(book_obj.publish) print(book_obj.pub_date) return HttpResponse('添加成功')
访问http://127.0.0.1:8000/add
数据库里面看看,第二条数据添加成功
控制台看看:
更改字段约束条件,设置日期允许为空,添加一个新的字段设置默认值
models.py文件
from django.db import models # Create your models here. class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32) pub_date = models.DateField(null=True) # null=True 设置允许为空 price = models.DecimalField(max_digits=8, decimal_places=2) publish = models.CharField(max_length=32) is_pub = models.BooleanField(default=True)
执行同步数据库更新命令,否则mysql不更新
点击Tools里面的Run manage.py Task....
执行命令:
makemigrations
会发现app01里面的migrations多出一个文件,此文件记录对应的操作
在执行命令,同步数据库
migrate
刷新数据库,新创建的字段已经被添加
添加一个日期为空的书籍
views.py
from django.shortcuts import render,HttpResponse from app01.models import Book # Create your views here. def add(request): # 日期不写 book_obj = Book.objects.create(title='三国演义', price="77.77", publish='第三出版社') print(book_obj) # 返回一个对象,包含记录的所有信息 print(book_obj.title) print(book_obj.price) print(book_obj.publish) print(book_obj.pub_date) return HttpResponse('添加成功')
访问
http://127.0.0.1:8000/add
刷新数据库,pub_date为空,成功添加
如果想查看ORM执行的sql语句,打开日志,就可以了
修改settings.py,在最后面添加
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'level': 'DEBUG', 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'level': 'DEBUG', 'propagate': True, }, }, }
在添加一本书:
from django.shortcuts import render,HttpResponse from app01.models import Book # Create your views here. def add(request): book_obj = Book.objects.create(title='水浒传',pub_date='2015-11-13', price="99.99", publish='第四出版社') print(book_obj) # 返回一个对象,包含记录的所有信息 print(book_obj.title) print(book_obj.price) print(book_obj.publish) print(book_obj.pub_date) return HttpResponse('添加成功')
访问:
http://127.0.0.1:8000/add
查看控制台输出信息:
添加查询视图
查询所有记录语法
Book.objects.all()
修改urls.py 路由控制文件,添加查询路由
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('add/', views.add), path('query/', views.query), ]
修改views.py 添加查询功能函数
from django.shortcuts import render,HttpResponse from app01.models import Book # Create your views here. def add(request): book_obj = Book.objects.create(title='水浒传',pub_date='2015-11-13', price="99.99", publish='第四出版社') print(book_obj) # 返回一个对象,包含记录的所有信息 return HttpResponse('添加成功') def query(request): # all() book_list = Book.objects.all() # 返回一个queryset数据类型 # queryset数据类型[obj,obj,obj], list里面存放的都是对象 print(book_list) for obj in book_list: # obj相当于表里面的每条记录 print(obj.title, obj.price) # 打印每个obj的书名,价格 return HttpResponse('查询成功')
访问:
http://127.0.0.1:8000/query
查看控制台输出信息
查询一条记录,修改上面的查询函数的代码
语法: 括号里面写条件
Book.objects.filter()
def query(request): ret = Book.objects.filter(price=66.66) for obj in ret: print(obj.title,obj.price) return HttpResponse('查询成功')
访问:
http://127.0.0.1:8000/query
first,last,切片操作
语法:
Book.objects.all().first()
Book.objects.all().last()
Book.objects.all()[1:3]
def query(request): # 查询第一条记录 obj1 = Book.objects.all().first() print(obj1.title, obj1.price) # 查询最后一条记录 obj2 = Book.objects.all().last() print(obj2.title, obj2.price) # 切片操作 obj3 = Book.objects.all()[1:3] for i in obj3: print(i.title, i.price) return HttpResponse('查询成功')
访问:http://127.0.0.1:8000/query
查询表记录
查询API
<1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 <5> order_by(*field): 对查询结果排序 <6> reverse(): 对查询结果反向排序 <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 <9> first(): 返回第一条记录 <10> last(): 返回最后一条记录 <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 <14> distinct(): 从返回结果中剔除重复纪录
基于双下划线的模糊查询
Book.objects.filter(price__in=[100,200,300]) 查询价格等于100,200,300的书籍 Book.objects.filter(price__gt=100) 查询价格大于100 Book.objects.filter(price__gte=100) 查询价格大于等于100 Book.objects.filter(price__lt=100) 查询价格小于100 Book.objects.filter(price__lte=100) 查询价格小于等于100 Book.objects.filter(price__range=[100,200]) 查询100到200之间的 Book.objects.filter(title__contains="python") 查询title中是否包含有python Book.objects.filter(title__icontains="python") 获得title字段里含有python的Book对象集合 Book.objects.filter(title__startswith="py") 查询以py开头的书籍 Book.objects.filter(pub_date__year=2012) 查询pub_date字段year=2012
update数据
修改urls.py,添加一条路由change
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('add/', views.add), path('query/', views.query), path('change/', views.change), ]
修改views.py,添加一个修改函数
查询id=1的字段,并更改price=333
def change(request): id = 1 Book.objects.filter(id=id).update(price=333) return HttpResponse('修改成功')
访问:http://127.0.0.1:8000/change/
查看数据是否修改成功,已经修改成功
delete数据
修改urls.py,添加一条路由delbook
from django.contrib import admin from django.urls import path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('add/', views.add), path('query/', views.query), path('change/', views.change), path('delbook/', views.delbook), ]
修改views.py,添加一个删除函数
def delbook(request): Book.objects.filter(title='水浒传').delete() return HttpResponse("删除成功")
访问: http://127.0.0.1:8000/delbook/
查看数据是否成功删除,成功删除
需求:url参数为2,就删除id为2的记录
例:http://127.0.0.1/delbook/2
修改urls.py,delbook路由
from django.contrib import admin from django.urls import path, re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path('add/', views.add), path('query/', views.query), path('change/', views.change), re_path('delbook/(?P<id>\d+)', views.delbook), ]
修改views.py
def delbook(request,id): # 接收id参数 Book.objects.filter(id=id).delete() return HttpResponse("删除成功")
访问:http://127.0.0.1:8000/delbook/2
如果数据不存在,也会提示删除成功
查看数据库里面是否更改
查询练习:
sql语句:
INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('1', 'python基础', '2017-06-01', '200.00', '人民出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('2', '西游记', '2017-08-08', '100.00', '苹果出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('3', '红楼梦', '2017-08-10', '50.00', '苹果出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('4', '水浒传', '2017-08-25', '150.00', '人民出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('5', '三国演义', '2017-12-20', '88.00', '苹果出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('6', 'python爬虫', '2018-02-10', '300.00', '人民出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('7', 'python大数据', '2018-05-15', '350.00', '苹果出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('8', 'java', '2017-08-11', '55.00', '苹果出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('9', 'go', '2018-06-04', '66.00', '苹果出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('10', 'php', '2018-06-08', '99.00', '苹果出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('11', 'c', '2018-05-22', '156.00', '苹果出版社', '1'); INSERT INTO `day71`.`app01_book` (`id`, `title`, `pub_date`, `price`, `publish`, `is_pub`) VALUES ('12', 'c++', '2018-04-17', '650.00', '苹果出版社', '1');
表数据如下:
1 查询苹果出版社出版过的价格大于200的书籍
ret = Book.objects.filter(price__gt=200, publish='苹果出版社', is_pub=True).values('title', 'price') for i in ret: print(i['title'], i['price'])
结果:
python大数据 350.00
c++ 650.00
2 查询2017年6月出版的所有以py开头的书籍名称
ret = Book.objects.filter(title__startswith='py',pub_date__year=2017, pub_date__month=6).values('title') for i in ret: print(i['title'])
结果:
python基础
3 查询价格为50,100或者150的所有书籍名称及其出版社名称
ret = Book.objects.filter(price__in=[50,100,150]).values('title', 'publish') for i in ret: print(i['title'], i['publish'])
结果:
西游记 苹果出版社
红楼梦 苹果出版社
水浒传 人民出版社
4 查询价格在100到200之间的所有书籍名称及其价格
ret = Book.objects.filter(price__range=[100, 200]).values('title', 'price') for i in ret: print(i['title'], i['price'])
结果:
python基础 200.00
西游记 100.00
水浒传 150.00
c 156.00
5 查询所有人民出版社出版的书籍的价格(从高到低排序,去重)
ret = Book.objects.filter(publish='人民出版社').order_by('price').reverse().values('title','price','publish') ..distinct() for i in ret: print(i['title'], i['price'],i['publish'])
结果:
python爬虫 300.00 人民出版社
python基础 200.00 人民出版社
水浒传 150.00 人民出版社
6 查询价格大于200的书籍的个数
ret = Book.objects.filter(price__gt=200).count() print(ret)
结果:
3
7 查询价格不等于100的所有书籍
ret = Book.objects.exclude(price=100).values('id', 'title', 'price', 'publish') for i in ret: print(i['id'], i['title'], i['price'], i['publish'])
结果:
1 python基础 200.00 人民出版社
3 红楼梦 50.00 苹果出版社
4 水浒传 150.00 人民出版社
5 三国演义 88.00 苹果出版社
6 python爬虫 300.00 人民出版社
7 python大数据 350.00 苹果出版社
8 java 55.00 苹果出版社
9 go 66.00 苹果出版社
10 php 99.00 苹果出版社
11 c 156.00 苹果出版社
12 c++ 650.00 苹果出版社
8 查询苹果出版社出版的书籍中的第3-7本(前提存在足够数量的书籍)
ret = Book.objects.filter(publish='苹果出版社')[3:7].values('id','title','price','publish') for i in ret: print(i['id'], i['title'], i['price'], i['publish'])
结果:
7 python大数据 350.00 苹果出版社
8 java 55.00 苹果出版社
9 go 66.00 苹果出版社
10 php 99.00 苹果出版社
上一篇: Django的路由控制
下一篇: django操作非ORM创建的表
47743
46233
37107
34625
29227
25882
24742
19861
19414
17906
5713°
6312°
5831°
5885°
6981°
5827°
5842°
6358°
6313°
7670°