Django中的models函数&ORM
一、数据库的配置
1、sqlite数据库
django默认支持
2、mysql数据库的配置
首先安装pymysql库
首先在django项目的settings.py文件中将默认的配置注释掉
# DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } # }
然后将mysql设置为django的默认数据库
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'dj', # 你的数据库名称 'USER': 'root', # 你的数据库用户名 'PASSWORD': '123456', # 你的数据库密码 'HOST': '', # 你的数据库主机,留空默认为localhost 'PORT': '3306', # 你的数据库端口 } }
在然后在项目的__init__().py文件内添加代码
import pymysql pymysql.install_as_MySQLdb()
3、创建表
在models.py文件中
eg:创建一张表
class Book(models.Model): name = models.CharField(max_length=25) price = models.IntegerField
在命令行窗口依次执行
python manage.py makemigrations
python manage.py migrate
结果成功创建blog_book表,表名默认为app名_类名 |
+----------------------------+ | blog_book | +----------------------------+
二、 向表中添加数据(增)
eg:
ef index(request): if request.method == 'POST': Book.objects.create(name=request.POST['name'], price=request.POST['price']) return redirect('dat') else: return render(request, 'index.html')
三、修改表中数据(改)
a、用filter,filter返回的是一个queryset集合,这个集合有一个update方法
eg:将bbu这本书的名字改为俄罗斯方块从入门到精通
Book.objects.filter(name='bbu').update(name='俄罗斯方块从入门到精通')
b、用get,get返回的是一个model对象,没有update方法
eg:将python这本书的价格增加到120
pri = Book.objects.get(name='python') pri.price = 120 pri.save()
四、删除表中数据(删)
调用filter返回的queryset对象的delete方法
eg:将python这本书删除
Book.objects.filter(name='python').delete()
五、查(单表)
1、查询API:all()方法
返回包含数据库中所有对象的queryset
eg:查询所有书籍
def data(request): datas = Book.objects.all() return render(request, 'data.html', locals())
html文件
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% for data in datas %} <p>书名:{{ data.name }}   价格:{{ data.price }}</p> <p></p> {% endfor %} </body> </html>
结果
书名:俄罗斯方块从入门到精通 价格:123.0
书名:我的世界 价格:88.0
书名:俄罗斯方块从入门到精通 价格:22.0
书名:我们的青春 价格:220.0
书名:三毛流浪记 价格:55.0
书名:三毛流浪记2 价格:45.0
书名:小兵张嘎 价格:21.0
2、filter(**kwargs)方法
返回一个包含对象的集合,满足参数中的条件
eg:查询小兵张嘎这本书的价格
def data(request): datas = Book.objects.filter(name='小兵张嘎') return render(request, 'data.html', locals())
结果
书名:小兵张嘎 价格:21.0
3、exclude(**kwargs)方法
返回一个包含对象的集合,不满足参数中的条件
eg:查询所有书籍,除了小兵张嘎
def data(request): datas = Book.objects.exclude(name='小兵张嘎') return render(request, 'data.html', locals())
结果
书名:俄罗斯方块从入门到精通 价格:123.0
书名:我的世界 价格:88.0
书名:俄罗斯方块从入门到精通 价格:22.0
书名:我们的青春 价格:220.0
书名:三毛流浪记 价格:55.0
书名:三毛流浪记2 价格:45.0
4、get(**kwargs)方法、first()方法:返回第一组数据、last()方法:返回最后一组数据
返回一个model对象,不可遍历,符合筛选条件的对象超过一个或者没有均会报错
5、values(**kwargs)方法
返回一个特殊的queryset对象,一个可迭代的字典对象,作用:将表中的固定字段拿出
eg:查询所有书的名字
def data(request): datas = Book.objects.all().values('name') return render(request, 'data.html', locals())
结果
书名:俄罗斯方块从入门到精通
书名:我的世界
书名:俄罗斯方块从入门到精通
书名:我们的青春
书名:三毛流浪记
书名:三毛流浪记2
书名:小兵张嘎
6、values_list():返回的是一个元组序列
7、distinct():将数据去重
eg:将书名相同的书籍去重
def data(request): datas = Book.objects.all().values('name').distinct() return render(request, 'data.html', locals())
结果
书名:俄罗斯方块从入门到精通 :
书名:我的世界
书名:我们的青春
书名:三毛流浪记
书名:三毛流浪记2
书名:小兵张嘎
8、count():计数
eg:统计有多少本书
def data(request): datas = Book.objects.all().values('name') num_book = Book.objects.all().count() return render(request, 'data.html', locals())
结果
书名:俄罗斯方块从入门到精通
书名:我的世界
书名:俄罗斯方块从入门到精通 :
书名:我们的青春
书名:三毛流浪记
书名:三毛流浪记2
书名:小兵张嘎
共有7本书
9、模糊查询
eg:查询书名为“三毛”开头的书籍信息
def data(request): datas = Book.objects.filter(name__contains='三毛') return render(request, 'data.html', locals())
结果
书名:三毛流浪记 价格:55.0
书名:三毛流浪记2 价格:45.0
10、链式过滤
所谓链式过滤就是在queryset的基础上再次进行过滤
相当于将一条sql语句的结果当作另一条sql语句的条件
eg:查询价格为22元的俄罗斯方块(用链式过滤的方法)
def data(request): datas = Book.objects.filter(name='俄罗斯方块从入门到精通').filter(price=22) return render(request, 'data.html', locals())
结果
书名:俄罗斯方块从入门到精通 价格:22.0