首先创建一app01的项目
django-admin.py startproject app01
接下来在settings.py中找到INSTALLED_APPS这一项,如下:
INSTALLED_APPS =( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01', 添加初始 )
接下来,告诉Django使用pymysql模块连接mysql数据库:
__int__.py文件
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0)
pymysql.install_as_MySQLdb()
创建模型
在项目中的models.py中添加以下类:
models.py文件
class Book(models.Model):
id = models.AutoField(primary_key=True) id 会自动创建,可以手动写入
title = models.CharField(max_length=32) 书籍名称
price = models.DecimalField(max_digits=5, decimal_places=2) 书籍价格
publish = models.CharField(max_length=32) 出版社名称
pub_date = models.DateField() 出版时间
然后在命令行执行以下命令:
python manage.py migrate 创建表结构
python manage.py makemigrations app01 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate app01 创建表结构
数据库添加
规则配置:
app01/urls.py: 文件代码:
from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('add_book/', views.add_book), ]views.py文件代码 !!!!!!数据库添加from django.shortcuts import render,HttpResponsefrom app01 import models
def add_book(request):
数据库添加
方法一
book = models.Book(title="菜鸟教程",price=300,publish="菜鸟出版社",pub_date="2008-8-8")
book.save()
return HttpResponse("<p>数据添加成功!</p>")
方法二
books = models.Book.objects.create(title="如来神掌5", price=200, publish="功夫出版社", pub_date="2010-10-10")
return HttpResponse("<p>数据添加成功!</p>")
查找
使用 all() 方法来查询所有内容。
返回的是 QuerySet 类型数据,类似于 list,里面放的是一个个模型类的对象,可用索引下标取出模型类的对象。
books = models.Book.objects.all()
for i in books:
print(i.title)
QuerySet类型,类似于list,访问 url 时数据显示在命令行窗口中。
return HttpResponse("<p>查找成功!</p>")
1、根据条件查询
filter() 方法用于查询符合条件的数据。
返回的是 QuerySet 类型数据,类似于 list,里面放的是满足条件的模型类的对象,可用索引下标取出模型类的对象。
pk=3 的意思是主键 primary key=3,相当于 id=3。
因为 id 在 pycharm 里有特殊含义,是看内存地址的内置函数 id(),因此用 pk。
books = models.Book.objects.filter(pk=5)
print("//////////////////////////////////////")
books = models.Book.objects.filter(publish='菜鸟出版社', price=300)
print(books ) QuerySet类型,类似于list。
return HttpResponse("<p>查找成功!</p>")
2、exclude() 方法用于查询不符合条件的数据。
返回的是 QuerySet 类型数据,类似于 list,里面放的是不满足条件的模型类的对象,可用索引下标取出模型类的对象。
books = models.Book.objects.exclude(pk=5)
return HttpResponse("<p>查找成功!</p>")
3、get() 方法用于查询符合条件的返回模型类的对象符合条件的对象只能为一个,
如果符合筛选条件的对象超过了一个或者没有一个都会抛出错误。
books = models.Book.objects.get(pk=5)
books = models.Book.objects.get(pk=18) 报错,没有符合条件的对象
books = models.Book.objects.get(price=200) 报错,符合条件的对象超过一个
return HttpResponse("<p>查找成功!</p>")
4、order_by() 方法用于对查询结果进行排序。
返回的是 QuerySet类型数据,类似于list,里面放的是排序后的模型类的对象,可用索引下标取出模型类的对象。
注意:
a、参数的字段名要加引号。
b、降序为在字段前面加个负号 -。
books = models.Book.objects.order_by("price") 查询所有,按照价格升序排列
books = models.Book.objects.order_by("-price") 查询所有,按照价格降序排列
return HttpResponse("<p>查找成功!</p>")
5、reverse() 方法用于对查询结果进行反转。
返回的是 QuerySe t类型数据,类似于 list,里面放的是反转后的模型类的对象,可用索引下标取出模型类的对象。
按照价格升序排列:降序再反转 从小到大
books = models.Book.objects.order_by("-price").reverse()
return HttpResponse("<p>查找成功!</p>")
6、count() 方法用于查询数据的数量返回的数据是整数。
books = models.Book.objects.count() 查询所有数据的数量
books = models.Book.objects.filter(price=200).count() 查询符合条件数据的数量
return HttpResponse("<p>查找成功!</p>")
7、first() 方法返回第一条数据返回的数据是模型类的对象也可以用索引下标 [0]。
books = models.Book.objects.first() 返回所有数据的第一条数据
return HttpResponse("<p>查找成功!</p>")
8、last() 方法返回最后一条数据返回的数据是模型类的对象不能用索引下标 [-1],ORM 没有逆序索引。
books = models.Book.objects.last() 返回所有数据的最后一条数据
return HttpResponse("<p>查找成功!</p>")
9、exists() 方法用于判断查询的结果 QuerySet 列表里是否有数据。
返回的数据类型是布尔,有为 true,没有为 false。
注意:判断的数据类型只能为 QuerySet 类型数据,不能为整型和模型类的对象。
books = models.Book.objects.exists()
books = models.Book.objects.count().exists() 报错,判断的数据类型只能为QuerySet类型数据,不能为整型
books = models.Book.objects.first().exists()报错,判断的数据类型只能为QuerySet类型数据,不能为模型类对象
return HttpResponse("<p>查找成功!</p>")
10、values() 方法用于查询部分字段的数据。
返回的是 QuerySet 类型数据,类似于 list,里面不是模型类的对象,而是一个可迭代的字典序列,字典里的键是字段,值是数据。
注意:
参数的字段名要加引号
想要字段名和数据用 values
查询所有的id字段和price字段的数据
books = models.Book.objects.values("pk", "price")
print(books[0]["price"]) 得到的是第一条记录的price字段的数据
for i in books:
print(i["price"]) 得到所有的价格
return HttpResponse("<p>查找成功!</p>")
11、values_list() 方法用于查询部分字段的数据。
返回的是 QuerySet 类型数据,类似于 list,里面不是模型类的对象,而是一个个元组,元组里放的是查询字段对应的数据。
注意:
参数的字段名要加引号
只想要数据用 values_list
查询所有的price字段和publish字段的数据
books = models.Book.objects.values_list("price", "publish")
print(books[0])
return HttpResponse("<p>查找成功!</p>")
12、distinct() 方法用于对数据进行去重。
返回的是 QuerySet 类型数据。
注意:
对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
distinct() 一般是联合 values 或者 values_list 使用。
查询一共有多少个出版社
books = models.Book.objects.values_list("publish").distinct() 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
books = models.Book.objects.distinct()
return HttpResponse("<p>查找成功!</p>")
13、filter() 方法基于双下划线的模糊查询(exclude 同理)。
注意:filter 中运算符号只能使用等于号 = ,不能使用大于号 > ,小于号 < ,等等其他符号。
__in 用于读取区间,= 号后面为列表 。
查询价格为200或者300的数据
books = models.Book.objects.filter(price__in=[200, 300])
__gt 大于号 ,= 号后面为数字。
查询价格大于200的数据
books = models.Book.objects.filter(price__gt=200)
__gte 大于等于,= 号后面为数字。
查询价格大于等于200的数据
books = models.Book.objects.filter(price__gte=200)
__lt 小于,=号后面为数字。
查询价格小于300的数据
books = models.Book.objects.filter(price__lt=300)
__lte 小于等于,= 号后面为数字。
查询价格小于等于300的数据
books = models.Book.objects.filter(price__lte=300)
__range 在 ... 之间,左闭右闭区间,= 号后面为两个元素的列表。
查询价格在200, 300之间的数据
books = models.Book.objects.filter(price__range=[200, 300])
__contains 包含,= 号后面为字符串。
查询包含 菜 的数据
books = models.Book.objects.filter(title__contains="菜")
__icontains 不区分大小写的包含,= 号后面为字符串。
books = models.Book.objects.filter(title__icontains="python") 不区分大小写
__startswith 以指定字符开头,= 号后面为字符串。
books = models.Book.objects.filter(title__startswith="菜")
__endswith 以指定字符结尾,= 号后面为字符串。
books = models.Book.objects.filter(title__endswith="教程")
__year 是 DateField 数据类型的年份,= 号后面为数字。
books = models.Book.objects.filter(pub_date__year=2008)
__month 是DateField 数据类型的月份,= 号后面为数字。
books = models.Book.objects.filter(pub_date__month=10)
__day 是DateField 数据类型的天数,= 号后面为数字。
books=models.Book.objects.filter(pub_date__day=10)
return HttpResponse("<p>查找成功!</p>")
14、删除
方式一:使用模型类的 对象.delete()。
返回值:元组,第一个元素为受影响的行数。
注意:
a. Django 删除数据时,会模仿 SQL约束 ON DELETE CASCADE 的行为,也就是删除一个对象时也会删除与它相关联的外键对象。
b. delete() 方法是 QuerySet 数据类型的方法,但并不适用于 Manager 本身。也就是想要删除所有数据,不能不写 all。
books=models.Book.objects.delete() 报错
books=models.Book.objects.all().delete() 删除成功
books = models.Book.objects.filter(pk=6).first().delete()
方式二:使用 QuerySet 类型数据.delete()(推荐)
返回值:元组,第一个元素为受影响的行数。
books = models.Book.objects.filter(pk__in=[5]).delete()
return HttpResponse("<p>删除成功!</p>")
15、修改
方式一:
模型类的对象.属性 = 更改的属性值
模型类的对象.save()
返回值:编辑的模型类的对象。
books = models.Book.objects.filter(pk=4).first()
books.price = 400
books.save()
方式二:QuerySet 类型数据.update(字段名=更改的数据)(推荐)
返回值:整数,受影响的行数
books = models.Book.objects.filter(pk__in=[2,3]).update(price=888)
return HttpResponse("<p>修改成功!</p>")