django的模型层
django的模型层
一 创建单表
1.创建模型
app01 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,unique=True) pub_date=models.DateField() price=models.DecimalField(max_digits=8,decimal_places=2) publish=models.CharField(max_length=32)
2.配置数据库
settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'orm', # 要连接的数据库,连接前需要创建好 'USER':'ysl', # 连接数据库的用户名 'PASSWORD':'123456', # 连接数据库的密码 'HOST':'10.0.0.51', # 连接主机,默认本级 'PORT':3306 # 端口 默认3306 } }
3. 配置mysql模块
因为django默认你导入的驱动是MySQLdb
python3 mysql的驱动是 pymysql
所以在工orm __init__.py 写入
import pymysql pymysql.install_as_MySQLdb()
4 打印 orm转换过程中的sql
settings.py 设置
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
5 命令行运行命令
python manage.py makemigrations
python manage.py migrate
二 单表添加表记录
from app01.models import Book def index(request): # 添加表记录 #方式1 # book_obj = Book(title="python",price=100,pub_date="2010-10-10",publish="人民出版社") # book_obj.save() #方式2 # book_obj = Book.objects.create(title="php",price=100,pub_date="2011-10-10",publish="人民出版社") # print(book_obj.title) #php # print(book_obj.price) #100 # print(book_obj.pub_date) #2011-10-10 return HttpResponse("ok")
三 查询表记录
1 all() 方法
调用者Book.objects 返回值 queryset对象
# 1)all()方法 调用者Book.objects 返回值 queryset对象 book_list = Book.objects.all() print(book_list) #[<Book: Book object (1)>, <Book: Book object (2)>] [obj1,obj2] for obj in book_list: print(obj.title,obj.price) # python 100.00 # php 100.00 # go 200.00
2 first()方法 last() 方法
调用者 queryset 对象 返回值:model对象
# 2) first last 调用者 queryset 对象 返回值:model对象 book_list = Book.objects.all().first() book_list = Book.objects.all()[0] print(book_list)
3 filter() 方法
调用者Book.objects 返回值queryset对象
# 3) filter() 调用者Book.objects 返回值queryset对象 book_list = Book.objects.filter(price=100) print(book_list) #<QuerySet [<Book: python>, <Book: php>]> book_obj = Book.objects.filter(price=100).first() print(book_obj) ret = Book.objects.filter(price=100,title='python') print(ret)
4 get() 方法
有且只有一个查询结果时才有意义 返回值:model对象
# 4) get 有且只有一个查询结果时才有意义 返回值:model对象 book_obj = Book.objects.get(title="go") book_obj=Book.objects.get(price=100) print(book_obj.price)
5 exclude() 方法
调用者Book.objects 返回值 queryset对象 排除go 其他的都打印出来
ret = Book.objects.exclude(title="go") print(ret)
6 order_by() 方法
order_by 排序 调用者: queryset对象 返回值: queryset对象
ret = Book.objects.all().order_by("id") #-id desc id asc ret=Book.objects.all().order_by("price","id") print(ret)
7 count()
调用者: queryset对象 返回值: int
ret = Book.objects.all().count() print(ret)
8 exist() 是否为空
ret = Book.objects.all().exists() if ret: print("ok")
9 values() 方法
调用者: queryset对象 返回值:queryset对象
# ret = Book.objects.all() # for i in ret: # print(i.title) ret = Book.objects.all().values('title') print(ret) #<QuerySet [{'title': 'go'}, {'title': 'php'}, {'title': 'python'}]> print(ret[0].get("title")) #go
10 values_list() 方法
调用者: queryset对象 返回值:queryset对象
ret = Book.objects.all().values_list("price", "title") print(ret) # <QuerySet [(Decimal('100.00'), 'python'), (Decimal('100.00'), 'php'), (Decimal('200.00'), 'go')]>
11 distinct() 方法
调用者: queryset对象 返回值:queryset对象
ret = Book.objects.all().values("price").distinct() print(ret) #<QuerySet [{'price': Decimal('100.00')}, {'price': Decimal('200.00')}]>
四 单表查询之模糊查询
Book.objects.filter(price__in=[100,200,300]) Book.objects.filter(price__gt=100) Book.objects.filter(price__lt=100) Book.objects.filter(price__range=[100,200]) Book.objects.filter(title__contains="python") # 不区分p大小写 Book.objects.filter(title__icontains="Python") Book.objects.filter(title__startswith="py") Book.objects.filter(pub_date__year=2012)
五 删除,修改记录
1 删除记录
delete: 调用者: queryset对象 model对象
ret=Book.objects.filter(price=100).delete() print(ret) Book.objects.filter(price=100).first().delete()
2 修改记录
update : 调用者: queryset对象
ret=Book.objects.filter(title="php2").update(title="php")
六 练习 单表查询图书系统
实现功能:book单表的增删改查
1 创建对应的mysql表
app01/modeles.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,unique=True) pub_date=models.DateField() price=models.DecimalField(max_digits=8,decimal_places=2) publish=models.CharField(max_length=32) def __str__(self): return self.title
2 设置mysql
ORM/ORM/setting.py
1) 设置mysql
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'orm', # 要连接的数据库,连接前需要创建好 'USER':'ysl', # 连接数据库的用户名 'PASSWORD':'123456', # 连接数据库的密码 'HOST':'10.0.0.51', # 连接主机,默认本级 'PORT':3306 # 端口 默认3306 } }
2)把app01注册到项目中
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', ]
3)配置静态文件
# static 是静态文件的别名 STATIC_URL = '/static/' # 配置 静态文件 STATICFILES_DIRS=[ os.path.join(BASE_DIR,"static"), ]
4)打印orm转换过程中的sql
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console':{ 'level':'DEBUG', 'class':'logging.StreamHandler', }, }, 'loggers': { 'django.db.backends': { 'handlers': ['console'], 'propagate': True, 'level':'DEBUG', }, } }
5) 配置mysql模块
因为django默认你导入的驱动是MySQLdb
python3 mysql的驱动是 pymysql
所以在工orm __init__.py 写入
import pymysql pymysql.install_as_MySQLdb()
6)命令行运行命令
python manage.py makemigrations
python manage.py migrate
3 配置url地址
ORM/ORM/urls.py
from django.contrib import admin from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), path("books/",views.books), path("addbook/",views.addbook), re_path("books/(\d+)/delete",views.delete), re_path("books/(\d+)/change",views.change), ]
4 配置视图
app01/views.py
def books(request): book_list = Book.objects.all() return render(request,"books.html",locals()) def addbook(request): if request.method=="POST": title = request.POST.get("title") price = request.POST.get("price") date = request.POST.get("date") publish = request.POST.get("publish") Book.objects.create(title=title,price=price,pub_date=date,publish=publish) return redirect("/books/") return render(request, "addbook.html") def delete(request,id): Book.objects.filter(id=id).delete() return redirect("/books/") def change(request,id): book_obj = Book.objects.filter(id=id).first() if request.method=="POST": title = request.POST.get("title") price = request.POST.get("price") date = request.POST.get("date") publish = request.POST.get("publish") Book.objects.filter(id=id).update(title=title,price=price,pub_date=date,publish=publish) return redirect("/books/") return render(request, "change.html",{"book_obj":book_obj})
5. 配置Template
1) 设置 static
2) 配置对应的模版
base.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <!-- 标题模版--> {% block title %} <title>base</title> {% endblock %} <link rel="stylesheet" type="text/css" href="/static/bootstrap-3.3.7/css/bootstrap.css"> <script type="text/javascript" src="/static/jquery-3.4.1.js"></script> <style> .header { width: 100%; height: 50px; background-color: #369; font-size: 40px; text-align: center; line-height: 50px; } </style> </head> <body> <div class="header" >图书管理系统</div> <div class="container" style="margin-top: 100px;"> <div class="row"> <div class="col-lg-6 col-lg-offset-3"> {% block content %} {% endblock %} </div> </div> </div> </body> </html>
books.html
{% extends "base.html" %} {% block title %} <title>books</title> {% endblock title %} {% block content %} <a href="/addbook/" class="btn btn-primary btn-lg">添加书籍</a> <table class="table table-bordered table-hover" style="margin-top: 10px;"> <tr> <th>书籍名称</th> <th>价格</th> <th>出版日期</th> <th>出版社</th> <th>删除操作</th> <th>编辑操作</th> </tr> {% for book in book_list %} <tr> <td>{{ book.title }}</td> <td>{{ book.price }}</td> <td>{{ book.pub_date|date:'Y-m-d' }}</td> <td>{{ book.publish }}</td> <td><a href="/books/{{ book.pk }}/delete" class="btn btn-danger">删除</a></td> <td><a href="/books/{{ book.pk }}/change" class="btn btn-info">编辑</a></td> </tr> {% endfor content%} </table> {% endblock %}
addbook.html
{% extends "base.html" %} {% block title %} <title>addbook</title> {% endblock %} {% block content %} <form action="" method="post"> {% csrf_token %} <div> <label for="">数据名称</label> <input type="text" class="form-control" name="title"> </div> <div> <label for="">价格</label> <input type="text" class="form-control" name="price"> </div> <div> <label for="">出版日期</label> <input type="date" class="form-control" name="date"> </div> <div> <label for="">出版社</label> <input type="text" class="form-control" name="publish"> </div> <input type="submit" class="btn btn-success btn-lg pull-right" style="margin-top: 10px;"> </form> {% endblock %}
change.html
{% extends "base.html" %} {% block title %} <title>change</title> {% endblock %} {% block content %} <form action="" method="post"> {% csrf_token %} <div> <label for="">数据名称</label> <input type="text" class="form-control" name="title" value="{{ book_obj.title }}"> </div> <div> <label for="">价格</label> <input type="text" class="form-control" name="price" value="{{ book_obj.price }}"> </div> <div> <label for="">出版日期</label> <input type="date" class="form-control" name="date" value="{{ book_obj.pub_date|date:'Y-m-d' }}"> </div> <div> <label for="">出版社</label> <input type="text" class="form-control" name="publish" value="{{ book_obj.publish }}"> </div> <input type="submit" class="btn btn-success btn-lg pull-right" style="margin-top: 10px;"> </form> {% endblock %}
posted on 2019-11-09 11:47 augustyang 阅读(193) 评论(0) 编辑 收藏 举报