django-5-使用数据库
修改默认数据库
django默认数据库为 SQLite3,若需要修改,比如改成mysql,则需要修改与settings.py文件同路径的__init__.py文件,添加如下内容:
- import pymysql
- pymysql.install_as_MySQLdb()
ORM
1、单表增删改查
在models.py文件中创建数据库对象,然后同步数据库。
- from django.db import models
- class Person(models.Model):
- name = models.CharField(max_length=30)
- age = models.IntegerField()
在views.py中导入models.py(from app.models import *),然后可以在函数或者方法中使用如下内容来调用数据库。
增:
- 增加数据有两种方式
- 方式1
- b = Person(name=”姓名“,age=年龄)
- b.save()
- 方式二
- Person.objects.create(name=”姓名“,age=年龄)
改:
- 方式1
- Person.objects.filter(name="姓名").update(age=新的年龄)
- 方式2
- p= Person.objects.get(name="姓名")
- p.age = 新的年龄
- p.save()
- 请注意get只能取出一条,多了会报错。
删:
- Person.objects.filter(name="姓名").delete()
查询:
都是通过objects来调用查询方法:如Person.objects.all()
- # 查询相关API:
- # <1>filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
- # <2>all(): 查询所有结果
- # <3>get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
- #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()--------
- # <4>values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列
- # <5>exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
- # <6>order_by(*field): 对查询结果排序
- # <7>reverse(): 对查询结果反向排序
- # <8>distinct(): 从返回结果中剔除重复纪录
- # <9>values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
- # <10>count(): 返回数据库中匹配查询(QuerySet)的对象数量。
- # <11>first(): 返回第一条记录
- # <12>last(): 返回最后一条记录
- # <13>exists(): 如果QuerySet包含数据,就返回True,否则返回False。
2、一对多
创建数据库:
- from django.db import models
- class Publisher(models.Model):
- name = models.CharField(max_length=30, verbose_name="名称")
- address = models.CharField("地址", max_length=50)
- city = models.CharField('城市',max_length=60)
- state_province = models.CharField(max_length=30)
- country = models.CharField(max_length=50)
- website = models.URLField()
- def __str__(self):
- return self.name
- class Book(models.Model):
- title = models.CharField(max_length=100)
- publisher = models.ForeignKey("Publisher")
- publication_date = models.DateField()
- price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
- def __str__(self):
- return self.title
publisher = models.ForeignKey("Publisher")就是建立外键关联。
增:
- #一对多(ForeignKey):
- #方式一: 由于绑定一对多的字段,比如publish,存到数据库中的字段名叫publish_id,所以我们可以直接给这个
- # 字段设定对应值:
- Book.objects.create(title='php',
- publisher_id=2, #这里的2是指为该book对象绑定了Publisher表中id=2的行对象
- publication_date='2017-7-7',
- price=99)
- #方式二:
- # <1> 先获取要绑定的Publisher对象:
- pub_obj=Publisher(name='河大出版社',address='保定',city='保定',
- state_province='河北',country='China',website='http://www.hbu.com')
- OR pub_obj=Publisher.objects.get(id=1)
- Book.objects.create(title='php',
- publisher=pub_obj, #将 publisher_id=2 改为 publisher=pub_obj
- publication_date='2017-7-7',
- price=99)
3、多对多
- from django.db import models<br>
- class Publisher(models.Model):
- name = models.CharField(max_length=30, verbose_name="名称")
- address = models.CharField("地址", max_length=50)
- city = models.CharField('城市',max_length=60)
- state_province = models.CharField(max_length=30)
- country = models.CharField(max_length=50)
- website = models.URLField()
- class Meta:
- verbose_name = '出版商'
- verbose_name_plural = verbose_name
- def __str__(self):
- return self.name
- class Author(models.Model):
- name = models.CharField(max_length=30)
- def __str__(self):
- return self.name
- class AuthorDetail(models.Model):
- sex = models.BooleanField(max_length=1, choices=((0, '男'),(1, '女'),))
- email = models.EmailField()
- address = models.CharField(max_length=50)
- birthday = models.DateField()
- author = models.OneToOneField(Author)
- class Book(models.Model):
- title = models.CharField(max_length=100)
- authors = models.ManyToManyField(Author)
- publisher = models.ForeignKey(Publisher)
- publication_date = models.DateField()
- price=models.DecimalField(max_digits=5,decimal_places=2,default=10)
- def __str__(self):
- return self.title
增:
- #多对多(ManyToManyField()):
- author1=Author.objects.get(id=1)
- author2=Author.objects.filter(name='alvin')[0]
- book=Book.objects.get(id=1)
- book.authors.add(author1,author2)
- #等同于:
- book.authors.add(*[author1,author2])
- book.authors.remove(*[author1,author2])
- #-------------------
- book=models.Book.objects.filter(id__gt=1)
- authors=models.Author.objects.filter(id=1)[0]
- authors.book_set.add(*book)
- authors.book_set.remove(*book)
- #-------------------
- book.authors.add(1)
- book.authors.remove(1)
- authors.book_set.add(1)
- authors.book_set.remove(1)
- #注意: 如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式
- # 如果第三张表是自己创建的:
- class Book2Author(models.Model):
- author=models.ForeignKey("Author")
- Book= models.ForeignKey("Book")
- # 那么就还有一种方式:
- author_obj=models.Author.objects.filter(id=2)[0]
- book_obj =models.Book.objects.filter(id=3)[0]
- s=models.Book2Author.objects.create(author_id=1,Book_id=2)
- s.save()
- s=models.Book2Author(author=author_obj,Book_id=1)
- s.save()
删:
- Book.objects.filter(id=1).delete()
- #我们表面上删除了一条信息,实际却删除了三条,因为我们删除的这本书在Book_authors表中有两条相关信息,这种删除方式就是django默认的级联删除。
同步数据库 (将写好的数据表写入数据库)
# Django 1.6.x 及以下
python manage.py syncdb
# Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate
django-5-使用数据库的更多相关文章
- Django根据现有数据库建立model
Django引入外部数据库还是比较方便的,步骤如下 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自动生 ...
- python——django使用mysql数据库(二)
上一篇中,我们已经讲述了如何初始化一个django数据库,这一章就来讲讲在实际的项目中如何使用我们初始化的数据库呢? 如还未进行初始化数据库操作,请参考python——django使用mysql数据库 ...
- python——django使用mysql数据库(一)
之前已经写过如何创建一个django项目,现在我们已经有了一个小骷髅,要想这个web工程变成一个有血有肉的人,我们还需要做很多操作.现在就先来介绍如何在django中使用mysql数据库. 前提:已经 ...
- ubuntu 下搭建一个python3的虚拟环境(用于django配合postgresql数据库开发)
#安装python pip (在物理环境中安装) sudo apt-get install python-pip sudo apt-get install python3-pipsud ...
- django MVC模式 数据库的操作mysql
介绍:本节课我们继续学习djangoWEB框架的开发,这节课主要是学习如何访问数据库,django如何自动为我们创建好表结构等相关内容. 1.首先我们打开settings.py找到DATABASES关 ...
- Django 连接mysql数据库中文乱码
Django 连接mysql数据库中文乱码 2018年08月25日 20:55:15 可乐乐乐乐乐 阅读数:566 版本:CentOS6.8 python3.6.4 django1.8.2 数据库 ...
- 用 Django 管理现有数据库
在多数项目中,总有一些几乎一成不变的 CRUD 操作,编写这些代码很无聊,但又是整个系统必不可少的功能之一.我们在上一个项目中也面临类似的问题,虽然已经实现了一个功能相对完整的管理后台,也尽量做到了代 ...
- django之ORM数据库操作
一.ORM介绍 映射关系: 表名 -------------------->类名 字段-------------------->属性 表记录----------------->类实例 ...
- django引入现有数据库 转
django引入现有数据库 Django引入外部数据库还是比较方便的,步骤如下: 1.创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新 ...
- Django根据现有数据库建立/更新model
Django引入外部数据库还是比较方便的,步骤如下: 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自动 ...
随机推荐
- UVAlive 6756 Increasing Shortest Path
We all love short and direct problems, it is easier to write, read and understand the problem statem ...
- Activiti6.0 java项目框架 spring5 SSM 工作流引擎 审批流程
工作流模块----------------------------------------------------------------------------------------------- ...
- LeetCode Array Easy 485. Max Consecutive Ones
Description Given a binary array, find the maximum number of consecutive 1s in this array. Example 1 ...
- go语言从例子开始之Example35.原子计数器
Go 中最主要的状态管理方式是通过通道间的沟通来完成的,我们在工作池的例子中碰到过,但是还是有一些其他的方法来管理状态的.这里我们将看看如何使用 sync/atomic包在多个 Go 协程中进行 原子 ...
- Django--Auth模块使用
1.Auth模块介绍 1.1 Auth模块是Django自带的用户认证模块,用于处理用户账户.群组.许可和基于cookie的用户回话 Django的认证系统主要包括下面几个部分 1.用户 2.许可 3 ...
- centos7系统中忘记了root管理员账号密码的解决方式(转)
随着计算机的使用越来越普遍,现在的用户都会有多个密码,不是这软件的密码就是那个的,QQ.邮箱.游戏,还有系统的登录密码!每一个密码都不一样!所以越来越多的密码需要去记住!也因为这样,只要其中一个长时间 ...
- postgresql绿色版安装及Navicat创建数据库,导入导出sql
转载:https://www.cnblogs.com/winkey4986/p/5360551.html 1.设置安装路径为:D:\soft\pgsql,数据存储路径为:D:\soft\pgsql\d ...
- mysql中文乱码解决办法
Windows 在C:\Program Files\MySQL\MySQL Server 5.5\bin目录下 MySQLInstanceConfig.exe执行 重新配置character_set_ ...
- DevOps打造端到端的价值交付
首先就要来说下什么是端到端: 敏捷帮助我们解决了开发域从计划到测试(部分测试内容)的问题 持续集成帮助解决了从计划到测试完成的过程 持续发布解决了从计划到待发布的过程 持续部署解决了从计划到已上线的过 ...
- Python的list中的选取范围
a = [1,2,3,4,5,6,7,8,9,10] a[0:1] = [1] a[0:2] = [1,2] 包含开头,不包含结尾. a [:-1]: 从头一直到最后一个元素a[-1],但不包含最后一 ...