Django入门四之数据库相关
1. 数据库设置
在settings.py中配置数据库
我首先使用的是sqlite3,所以配置如下
2. 数据库的数据结构定义
#blog/models.py
#定义了一个表(Student),表里两个字段name,age
from django.db import models class Student(models.Model):
name = models.CharField(max_length = 50)
age = models.IntegerField()
3. 创建/同步数据库
CMD进入项目目录,执行命令
(DJANGO~1) F:\Python Script\Django web\website>manage.py syncdb
这时候,在目录中就会创建一个数据库文件
我们用SQLiteStudio(点此下载)打开这个文件
发现,Django会自动给我们创建一个id字段的主键
已经创建了数据库后,还能再同步吗?
- 此时我们如果在models.py的Student中新增一个字段,然后再执行 manage.py syncdb ,是不能同步在数据库的。必须先删除已存在的表,再 manage.py syncdb,这样是冒险的,注意做好数据备份
- 我们在 SQLiteStudio 新建表
然后CMD中执行
(DJANGO~1) F:\Python Script\Django web\website>manage.py inspectdb
会出现要创建这些数据库的表,字段,需要的python代码,如图
这里的代码,比我们自己写的会准确些,还规范吧?可以复制写入models.py
也可以用命令导入进去
(DJANGO~1) F:\Python Script\Django web\website>manage.py inspectdb > blog/models.py
运行命令后,这些都会导入进去,然后再修修改改
4. 数据库的增删改查
增删改查操作都可以在数据库软件中直接操作,但这里说的肯定不是这种方法,比较我们是为网站服务,肯定是在代码里动态实现
- 4.1 增加
#urls.py
url(r'^blog/student_list/$','student_list')
#views.py
from django.http import HttpResponse
from django.template import loader,Context
from blog.models import Student def student_list(request):
html = loader.get_template("student.html")
# 第一种方法:增加两行数据
stu1 = Student(name="Tom",age=25)
stu1.save()
stu2 = Student(name="Jay",age=32)
stu2.save() # 第二种方法:这里示例展示的结果是第一种方法的
stu = Student()
stu.name = "Lin"
stu.age = 41
stu.save # 第三种方法:这里示例展示的结果是第一种方法的
Student.objects.create(name="Chen",age=36)
Student.objects.get_or_create(name="Chen",age=36) #这个能防止重复 # 第四种方法:这里示例展示的结果是第一种方法的
stu = {"name":"Wong","age":18}
Student.objects.create(**stu) studentList = Student.objects.all() context = Context({"studentList":studentList})
return HttpResponse(html.render(context))
#student.html
<body>
{% for student in studentList %}
<li>{{ student.id }},{{ student.name }},{{ student.age }}</li>
{% endfor %}
</body>
由于增加数据是在函数里,所以我们必须先输入地址,使得函数得以运行,才能插入数据成功
输出的就是我们插入的两行数据
我们在SQLiteStudio查看一下,确实已经插入
-4.2 查询
#views.py (其他文件和上面一样,不做修改)
# 查询所有的数据,或者用切片限制行数(不支持负索引)
studentList = Student.objects.all()
studentList = Student.objects.all()[:10]
studentList = Student.objects.all().reverse[:2] #不支持负索引,但可以用reversse解决 # 对数据行进行筛选
studentList = Student.objects.get(id=1) #获取id是1的,返回不是集合,只能获取一行
studentList = Student.objects.filter(age=25) #选取age是25的
studentList = Student.objects.exclude(name="Tom") #排除name是Tom的 # 对数据列进行筛选
studentList = Student.objects.all().values("name","age") #value 返回的是一个查询对象,用list(studentList)后,返回的是列表,列表里面是一个一个的字典,字典是这样的{"name":"?","age":"?"}
studentList = Student.objects.all().values_list("name","age") #value_list返回的也是查询对象,用list(studentList)后,返回的也是列表,列表里面是一个一个的元祖,元祖是这样("nameValue","ageValue") # 注意:筛选符号举例,用双下划线加关键词,更多筛选条件符号看下图
studentList = Student.objects.filter(age__gt=20)
studentList = Student.objects.filter(name__regex="^T") # 正则表达式查询
studentList = Student.objects.filter(name__iregex="^t")# 正则表达式不区分大小写 # 对选取的数据再进行排序
studentList = Student.objects.all().order_by("age") #升序
studentList = Student.objects.all().order_by("-age") #降序 # 对数据进行去重操作
# 一般情况,单词查询不会出现重复,但是对多次查询结果进行合并,就有可能出现重复
stu1 = Student.objects.all()
stu2 = Student.objects.get(id = 1)
studentList = stu1|stu2 #将两次查询结果合并
studentList = studentList.distinct()
以上studentList都是一个查询object
可以使用两种方法,列出查询结果的元素
- list(studentList)
- for student in studentLst ...
更大筛选条件符号看下图
-4.3 修改
#views.py (其他文件和上面一样,不做修改)
# 第一种方法
Student.objects.filter(age = 25).update(name = 'Chow') # 第二种方法
stu = Student.objects.get(id = 2)
stu.name = 'Lee'
stu.age = 45
stu.save()
结果如下
-4.4 删除
#views.py (其他文件和上面一样,不做修改)
Student.objects.filter(age = 25).delete()
-4.5 查询python语句对应的SQL语句
print str(Student.objects.all().query)
# 反正就是最后加query就可以
5. 数据库的外键
5.1 如何增加添加外键
#models.py
注意:Teacher一定要放在Student之前,因为同步的时候代码是顺序执行,不放前面代码会执行错误
from django.db import models class Teacher(models.Model):
id = models.IntegerField(primary_key = True)
name = models.CharField(max_length = 50)
class Meta:
db_table = 'teacher' class Student(models.Model):
id = models.IntegerField(primary_key = True)
name = models.CharField(max_length = 50)
age = models.IntegerField()
sex = models.CharField(max_length = 10)
teacher = models.ForeignKey(Teacher,related_name = "stu_teacher")
class Meta:
db_table = 'student'
然后再cmd执行同步命令
(DJANGO~1) F:\Python Script\Django web\website>manage.py syncdb
然后在表中填入一些数据吧(小细节:得先填入teacher表,才能填写student表,不然会提交失败)
#teacher
#student
重点在这里
#views.py
from django.template import loader,Context
from blog.models import Student,Teacher def student_list(request):
html = loader.get_template("student.html") # 外键的两种获取方法
# 第一种,如果前面related_name没有填的话,这里stu_teacher改为set就可以
teacher = Teacher.objects.get(id=1)
studentList = teacher.stu_teacher.all() # 第二种
studentList = Student.objects.filter(teacher_id=1) context = Context({"studentList":studentList})
return HttpResponse(html.render(context))
#student.html
<body>
{% for student in studentList %}
<li>{{ student.id }},{{ student.name }},{{ student.age }},{{ student.sex }},{{ student.teacher.name }}</li>
{% endfor %}
</body>
两种方法输出的结果都是一样的
6. 用Shell来测试SQL语句
如何进入shell模式呢
首先如果有venv,得先进入venv,然后cd到项目所在目录
运行:python manage.py shell
(DJANGO~1) F:\Python Script\Django web\website>python manage.py shell
7. annotate,计数,求和,平均数
首先当然是先进入Shell模式
(DJANGO~1) F:\Python Script\Django web\website>python manage.py shell
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
导入相关模块和函数方法
from blog.models import Student,Teacher
from django.db.models import Counts,Avg,Sum # 方法还有Max,Min,StdDev(标准差),Variance(方差)
先展示一下现有数据
1. 计数
目的:查询每个老师的学生数量(teacher别,对id进行计数)
注意values和values_list的区别
第一种
>>> Student.objects.values("teacher").annotate(Count("id"))
[{'teacher': 1, 'id__count': 3}, {'teacher': 2, 'id__count': 1}]
第二种
>>> Student.objects.values_list("teacher").annotate(Count("id"))
[(1, 3), (2, 1)]
>>>Student.objects.values_list("teacher","sex").annotate(Count("id"))
[(1, u'\u5973', 1), (1, u'\u7537', 2), (2, u'\u7537', 1)]
2. 求平均数
>>> Student.objects.values("sex").annotate(ave_age=Avg("age"))
[{'ave_age': 21.0, 'sex': u'\u5973'}, {'ave_age': 21.666666666666668, 'sex': u'\u7537'}]
3.求和
>>> Student.objects.values("sex").annotate(sum_age=Sum("age"))
[{'sum_age': 21, 'sex': u'\u5973'}, {'sum_age': 65, 'sex': u'\u7537'}]
8. aggregation
9. 多对多关系
表与表之间既有一对多的关系也有多对多的关系
举例说明
- 一对多:一篇文章只能有一个作者,一个作者却可以写多篇文章
- 多对多:一个学生能参加多个兴趣小组,一个兴趣小组也能招揽多个学生
图省事可以这样填,只填一个表
models.py 上面的写法是简便写法
最好按下面来
因为menbership这个表我们可以做更多的扩展
数据提取方法:
第一种
# 查出喜欢篮球的所有学生
>>>from blog.models import Student,Teacher,Group
>>>group = Group.objects.get(id=1)
>>>group.members.values('name')
[{'name': u'\u9648\u4eae'}, {'name': u'\u9648\u751f'}, {'name': u'\u674e\u5a77'}
第二种
# 查出学生id=2喜欢什么项目
>>>student = Student.objects.get(id=2)
>>> student.group_set.values_list("name")
[(u'\u8db3\u7403',), (u'\u7bee\u7403',)]
Django入门四之数据库相关的更多相关文章
- python学习笔记--Django入门四 管理站点--二
接上一节 python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...
- python学习笔记--Django入门四 管理站点
上一节 Django入门三 Django 与数据库的交互:数据建模 "管理员界面"是基础功能中的重要部分. django.contrib 包 Django自动管理工具是djang ...
- Django入门4: ORM 数据库操作
大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...
- python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...
- 一、Django入门
1.安装: 下载地址:https://www.djangoproject.com/download/ 原文节选: How to get Django Django is available open- ...
- 小白学习django第四站-关联数据库
使用mysql连接django首先要配置好相关环境 首先在setting.py配置数据库信息(需要现在mysql中创建一个数据库) 在setting.py那个目录的__init__.py文件中写入 之 ...
- python学习笔记--Django入门三 Django 与数据库的交互:数据建模
把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...
- Django基础四(model和数据库)
上一篇博文学习了Django的form和template.到目前为止,我们所涉及的内容都是怎么利用Django在浏览器页面上显示内容.WEB开发除了数据的显示之外,还有数据的存储,本文的内容就是如何在 ...
- Django入门:操作数据库(Model)
Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表 基本结构 1 2 3 4 5 6 from django.db import model ...
随机推荐
- 【一天一道LeetCode】#72. Edit Distance
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given t ...
- Leetcode_28_Implement strStr
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41452047 Implement strStr(). Re ...
- MySQL学习笔记_5_SQL语言的设计与编写(上)
SQL语言的设计与编写(上) 一.SQL语句分类 数据定义语言(DDL): 用于定义和管理数据对象,包括数据库.数据表.视图.索引等.例如:CREATE.DROP.ALTER等语句. 数据操作语言(D ...
- How to Enable Trace or Debug for APIs executed as SQL Script Outside of the Applications ?
In this Document Goal Solution 1: How do you enable trace for an API when executed from a SQL ...
- ISLR系列:(4.3)模型选择 PCR & PLS
Linear Model Selection and Regularization 此博文是 An Introduction to Statistical Learning with Applicat ...
- 用C语言实现Ping程序功能
本文转载自:http://www.ibm.com/developerworks/cn/linux/network/ping/ ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具.p ...
- AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能
HTML5实现获取地理位置信息并定位功能 注:请点击此处进行充电! 前言 这篇文章主要介绍了HTML5实现获取地理位置信息并定位功能,本文讲解了原生HTML5.百度地图.谷歌地图等三种获取理位置信息并 ...
- 02_Nginx基本配置与参数说明 + 辅助命令
Nginx基本配置与参数说明,下面是nginx.conf配置文件 #运行用户 #user nobody; worker_processes 2; #全局错误日志及PID文件 #error_l ...
- Java-HttpServletResponse-HttpServletResponseWrapper
//继承ServletResponse,发送回复信息,servlet容器创建一个HttpServletResponse对象,将它作为service函数的参数 public interface Http ...
- vim多行增加缩进
http://blog.163.com/clevertanglei900@126/blog/static/11135225920116891750734/ 在Normal Mode下,命令>&g ...