1. 数据库设置

在settings.py中配置数据库

我首先使用的是sqlite3,所以配置如下

2. 数据库的数据结构定义

  #blog/models.py

  1. #定义了一个表(Student),表里两个字段name,age
  2. from django.db import models
  3.  
  4. class Student(models.Model):
  5. name = models.CharField(max_length = 50)
  6. age = models.IntegerField()

3. 创建/同步数据库

CMD进入项目目录,执行命令

  1. (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中执行

  1. (DJANGO~1) F:\Python Script\Django web\website>manage.py inspectdb

  会出现要创建这些数据库的表,字段,需要的python代码,如图

这里的代码,比我们自己写的会准确些,还规范吧?可以复制写入models.py

也可以用命令导入进去

  1. (DJANGO~1) F:\Python Script\Django web\website>manage.py inspectdb > blog/models.py

运行命令后,这些都会导入进去,然后再修修改改

4. 数据库的增删改查

增删改查操作都可以在数据库软件中直接操作,但这里说的肯定不是这种方法,比较我们是为网站服务,肯定是在代码里动态实现

- 4.1 增加

#urls.py

  1. url(r'^blog/student_list/$','student_list')

  #views.py

  1. from django.http import HttpResponse
  2. from django.template import loader,Context
  3. from blog.models import Student
  4.  
  5. def student_list(request):
  6. html = loader.get_template("student.html")
  7. # 第一种方法:增加两行数据
  8. stu1 = Student(name="Tom",age=25)
  9. stu1.save()
  10. stu2 = Student(name="Jay",age=32)
  11. stu2.save()
  12.  
  13. # 第二种方法:这里示例展示的结果是第一种方法的
  14. stu = Student()
  15. stu.name = "Lin"
  16. stu.age = 41
  17. stu.save
  18.  
  19. # 第三种方法:这里示例展示的结果是第一种方法的
  20. Student.objects.create(name="Chen",age=36)
    Student.objects.get_or_create(name="Chen",age=36) #这个能防止重复
  21.  
  22. # 第四种方法:这里示例展示的结果是第一种方法的
  23. stu = {"name":"Wong","age":18}
  24. Student.objects.create(**stu)
  25.  
  26. studentList = Student.objects.all()
  27.  
  28. context = Context({"studentList":studentList})
  29. return HttpResponse(html.render(context))

#student.html

  1. <body>
  2. {% for student in studentList %}
  3. <li>{{ student.id }},{{ student.name }},{{ student.age }}</li>
  4. {% endfor %}
  5. </body>

由于增加数据是在函数里,所以我们必须先输入地址,使得函数得以运行,才能插入数据成功

输出的就是我们插入的两行数据

我们在SQLiteStudio查看一下,确实已经插入

-4.2 查询

#views.py  (其他文件和上面一样,不做修改)

  1. # 查询所有的数据,或者用切片限制行数(不支持负索引)
  2. studentList = Student.objects.all()
  3. studentList = Student.objects.all()[:10]
  4. studentList = Student.objects.all().reverse[:2] #不支持负索引,但可以用reversse解决
  5.  
  6. # 对数据行进行筛选
  7. studentList = Student.objects.get(id=1) #获取id是1的,返回不是集合,只能获取一行
  8. studentList = Student.objects.filter(age=25) #选取age是25的
  9. studentList = Student.objects.exclude(name="Tom") #排除name是Tom的
  10.  
  11. # 对数据列进行筛选
  12. studentList = Student.objects.all().values("name""age") #value 返回的是一个查询对象,用list(studentList)后,返回的是列表,列表里面是一个一个的字典,字典是这样的{"name":"?","age":"?"}
  13. studentList = Student.objects.all().values_list("name","age") #value_list返回的也是查询对象,用list(studentList)后,返回的也是列表,列表里面是一个一个的元祖,元祖是这样("nameValue","ageValue")
  14.  
  15. # 注意:筛选符号举例,用双下划线加关键词,更多筛选条件符号看下图
  16. studentList = Student.objects.filter(age__gt=20)
  17. studentList = Student.objects.filter(name__regex="^T") # 正则表达式查询
  18. studentList = Student.objects.filter(name__iregex="^t")# 正则表达式不区分大小写
  19.  
  20. # 对选取的数据再进行排序
  21. studentList = Student.objects.all().order_by("age") #升序
  22. studentList = Student.objects.all().order_by("-age") #降序
  23.  
  24. # 对数据进行去重操作
  25. # 一般情况,单词查询不会出现重复,但是对多次查询结果进行合并,就有可能出现重复
  26. stu1 = Student.objects.all()
  27. stu2 = Student.objects.get(id = 1)
  28. studentList = stu1|stu2 #将两次查询结果合并
  29. studentList = studentList.distinct()

  以上studentList都是一个查询object

  可以使用两种方法,列出查询结果的元素

  1. list(studentList)
  2. for student in studentLst ...

   更大筛选条件符号看下图

-4.3 修改

#views.py  (其他文件和上面一样,不做修改)

  1. # 第一种方法
  2. Student.objects.filter(age = 25).update(name = 'Chow')
  3.  
  4. # 第二种方法
  5. stu = Student.objects.get(id = 2)
  6. stu.name = 'Lee'
  7. stu.age = 45
  8. stu.save()

    结果如下

  

-4.4 删除

#views.py  (其他文件和上面一样,不做修改)

  1. Student.objects.filter(age = 25).delete()

  -4.5 查询python语句对应的SQL语句  

  1. print str(Student.objects.all().query)

  # 反正就是最后加query就可以

5.  数据库的外键

  5.1 如何增加添加外键

   #models.py

注意:Teacher一定要放在Student之前,因为同步的时候代码是顺序执行,不放前面代码会执行错误

  1. from django.db import models
  2.  
  3. class Teacher(models.Model):
  4. id = models.IntegerField(primary_key = True)
  5. name = models.CharField(max_length = 50)
  6. class Meta:
  7. db_table = 'teacher'
  8.  
  9. class Student(models.Model):
  10. id = models.IntegerField(primary_key = True)
  11. name = models.CharField(max_length = 50)
  12. age = models.IntegerField()
  13. sex = models.CharField(max_length = 10)
  14. teacher = models.ForeignKey(Teacher,related_name = "stu_teacher")
  15. class Meta:
  16. db_table = 'student'

  然后再cmd执行同步命令

  1. (DJANGO~1) F:\Python Script\Django web\website>manage.py syncdb

  然后在表中填入一些数据吧(小细节:得先填入teacher表,才能填写student表,不然会提交失败

#teacher

#student

重点在这里

#views.py

  1. from django.template import loader,Context
  2. from blog.models import Student,Teacher
  3.  
  4. def student_list(request):
  5. html = loader.get_template("student.html")
  6.  
  7. # 外键的两种获取方法
  8. # 第一种,如果前面related_name没有填的话,这里stu_teacher改为set就可以
  9. teacher = Teacher.objects.get(id=1)
  10. studentList = teacher.stu_teacher.all()
  11.  
  12. # 第二种
  13. studentList = Student.objects.filter(teacher_id=1)
  14.  
  15. context = Context({"studentList":studentList})
  16. return HttpResponse(html.render(context))

  #student.html

  1. <body>
  2. {% for student in studentList %}
  3. <li>{{ student.id }},{{ student.name }},{{ student.age }},{{ student.sex }},{{ student.teacher.name }}</li>
  4. {% endfor %}
  5. </body>

两种方法输出的结果都是一样的

6. 用Shell来测试SQL语句

  如何进入shell模式呢

  首先如果有venv,得先进入venv,然后cd到项目所在目录

  运行:python manage.py shell

  1. (DJANGO~1) F:\Python Script\Django web\website>python manage.py shell

  

7. annotate,计数,求和,平均数

  首先当然是先进入Shell模式

  1. (DJANGO~1) F:\Python Script\Django web\website>python manage.py shell
  2. Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32
  3. Type "help", "copyright", "credits" or "license" for more information.
  4. (InteractiveConsole)
    >>>

  导入相关模块和函数方法

  1. from blog.models import Student,Teacher
  2. from django.db.models import Counts,Avg,Sum
  3.  
  4. # 方法还有Max,Min,StdDev(标准差),Variance(方差)

  先展示一下现有数据

  1. 计数

  目的:查询每个老师的学生数量(teacher别,对id进行计数)

  注意values和values_list的区别

  第一种

  1. >>> Student.objects.values("teacher").annotate(Count("id"))
  2. [{'teacher': 1, 'id__count': 3}, {'teacher': 2, 'id__count': 1}]

  第二种

  1. >>> Student.objects.values_list("teacher").annotate(Count("id"))
  2. [(1, 3), (2, 1)]
  1. >>>Student.objects.values_list("teacher","sex").annotate(Count("id"))
  2. [(1, u'\u5973', 1), (1, u'\u7537', 2), (2, u'\u7537', 1)]

  2. 求平均数

  1. >>> Student.objects.values("sex").annotate(ave_age=Avg("age"))
  2. [{'ave_age': 21.0, 'sex': u'\u5973'}, {'ave_age': 21.666666666666668, 'sex': u'\u7537'}]

  3.求和

  1. >>> Student.objects.values("sex").annotate(sum_age=Sum("age"))
  2. [{'sum_age': 21, 'sex': u'\u5973'}, {'sum_age': 65, 'sex': u'\u7537'}]

8. aggregation

9. 多对多关系

  表与表之间既有一对多的关系也有多对多的关系

  举例说明

  • 一对多:一篇文章只能有一个作者,一个作者却可以写多篇文章
  • 多对多:一个学生能参加多个兴趣小组,一个兴趣小组也能招揽多个学生

图省事可以这样填,只填一个表

models.py 上面的写法是简便写法

最好按下面来

因为menbership这个表我们可以做更多的扩展

 数据提取方法:

第一种

  1. # 查出喜欢篮球的所有学生
  2. >>>from blog.models import Student,Teacher,Group
  3. >>>group = Group.objects.get(id=1)
  4. >>>group.members.values('name')
  5. [{'name': u'\u9648\u4eae'}, {'name': u'\u9648\u751f'}, {'name': u'\u674e\u5a77'}

第二种

  1. # 查出学生id=2喜欢什么项目
  2. >>>student = Student.objects.get(id=2)
  3. >>> student.group_set.values_list("name")
  4. [(u'\u8db3\u7403',), (u'\u7bee\u7403',)]

Django入门四之数据库相关的更多相关文章

  1. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  2. python学习笔记--Django入门四 管理站点

    上一节  Django入门三 Django 与数据库的交互:数据建模 "管理员界面"是基础功能中的重要部分. django.contrib 包 Django自动管理工具是djang ...

  3. Django入门4: ORM 数据库操作

    大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...

  4. python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

    python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码 ...

  5. 一、Django入门

    1.安装: 下载地址:https://www.djangoproject.com/download/ 原文节选: How to get Django Django is available open- ...

  6. 小白学习django第四站-关联数据库

    使用mysql连接django首先要配置好相关环境 首先在setting.py配置数据库信息(需要现在mysql中创建一个数据库) 在setting.py那个目录的__init__.py文件中写入 之 ...

  7. python学习笔记--Django入门三 Django 与数据库的交互:数据建模

    把数据存取逻辑.业务逻辑和表现逻辑组合在一起的概念有时被称为软件架构的 Model-View-Controller (MVC)模式.在这个模式中, Model 代表数据存取层,View 代表的是系统中 ...

  8. Django基础四(model和数据库)

    上一篇博文学习了Django的form和template.到目前为止,我们所涉及的内容都是怎么利用Django在浏览器页面上显示内容.WEB开发除了数据的显示之外,还有数据的存储,本文的内容就是如何在 ...

  9. Django入门:操作数据库(Model)

    Django-Model操作数据库(增删改查.连表结构) 一.数据库操作 1.创建model表         基本结构 1 2 3 4 5 6 from django.db import model ...

随机推荐

  1. Github最流行的10,000个Java项目使用的类库

    本文由 ImportNew - Andy.Song 翻译自 takipiblog.欢迎加入翻译小组.转载请见文末要求. 前言 作为Java开发人员,总是需要面临这门不断成熟.高速改进中的语言.开发人员 ...

  2. 《java入门第一季》之Date类案例,算一算你的恋爱纪念日

    想算你和你对象谈了多久了,还在用笔算吗,是不是很头疼?写个程序算一算吧!会变得如此简单. import java.text.ParseException; import java.text.Simpl ...

  3. 学习tornado:模板

    第一次接触tornado的template,是在做oastub的时候,因为一位同学在handler里面硬编码了html代码,我决定引入template机制来降低逻辑与页面的耦合. 简介 tornado ...

  4. 在VS2012中实现Ext JS的智能提示太简单了

    Visual Studio 2012太强大了,居然能自己会去提取Ext JS的类的属性和方法,从而实现只能提示.下面就来介绍一下实现这个功能. 在Visual Studio 2012中随便创建一个We ...

  5. mtk camera 移植步骤

    mtk camera 移植步骤: 1, Kernel层驱动代码文件添加 /mediatek/custom/doov92_wet_tdd/kernel/imgsensor/下添加imx179_mipi_ ...

  6. Xcode两种调试小技巧

    1."全局"断点 正常情况下如果代码有错误,会直接触发SIGXXXX信号,然后中断在main函数里. 但是我们还是不知道到底是什么引发了异常信号.我们可以在断点导航器中添加一个全局 ...

  7. C++容器学习,与结构体排序和set来一场邂逅

    最近学习C++容器,积累一下.下面介绍set和multiset,并使用sort对结构体进行排序.C++之路漫漫其修远兮! 一.对结构体进行排序 // sort_struct.cpp : 定义控制台应用 ...

  8. android微信登录,分享

    这几天开发要用到微信授权的功能,所以就研究了一下.可是微信开放平台接入指南里有几个地方写的不清不楚.在此总结一下,以便需要的人. 很多微信公众平台的应用如果移植到app上的话就需要微信授权登陆了. 目 ...

  9. OpenCV——照亮边缘

    具体的算法原理可以参考: PS滤镜,照亮边缘 // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_ ...

  10. 坚持自己的追求,迎来 “中国系统开发网” (CSDN)的专访

    坚持自己的追求,迎来 "中国系统开发网" (CSDN)的专访: 专访马根峰:海量数据处理与分析大师的中国本土程序员" http://www.csdn.net/articl ...