Django 数据库与ORM
分类:Django作者:编程之家用户
一、数据库的配置
1 django默认支持sqlite,mysql,oracle,postgresql数据库。
<1> sqlite
django默认使用sqlite的数据库,默认自带sqlite的数据库驱动 。
引擎名称:django.db.backends.sqlite3
<2> mysql
引擎名称:django.db.backends.mysql
2 mysql驱动程序
- MySQLdb(mysql python)
- mysqlclient
- MySQL
- PyMySQL(纯python的mysql驱动程序)
3 在django的项目中会默认使用sqlite数据库,在settings里有如下设置:
如果我们想要更改数据库,需要修改如下:
DATABASES =
</span><span style="color: #800000;">'</span><span style="color: #800000;">default</span><span style="color: #800000;">'</span><span style="color: #000000;">: {
</span><span style="color: #800000;">'</span><span style="color: #800000;">ENGINE</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">django.db.backends.mysql</span><span style="color: #800000;">'</span><span style="color: #000000;">,</span><span style="color: #800000;">'</span><span style="color: #800000;">NAME</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">books</span><span style="color: #800000;">'</span>,<span style="color: #008000;">#</span><span style="color: #008000;">你的数据库名称</span>
<span style="color: #800000;">'</span><span style="color: #800000;">USER</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">root</span><span style="color: #800000;">'</span>,<span style="color: #008000;">#</span><span style="color: #008000;">你的数据库用户名</span>
<span style="color: #800000;">'</span><span style="color: #800000;">PASSWORD</span><span style="color: #800000;">'</span>: <span style="color: #800000;">''</span>,<span style="color: #008000;">#</span><span style="color: #008000;">你的数据库密码</span>
<span style="color: #800000;">'</span><span style="color: #800000;">HOST</span><span style="color: #800000;">'</span>: <span style="color: #800000;">''</span>,<span style="color: #008000;">#</span><span style="color: #008000;">你的数据库主机,留空默认为localhost</span>
<span style="color: #800000;">'</span><span style="color: #800000;">PORT</span><span style="color: #800000;">'</span>: <span style="color: #800000;">'</span><span style="color: #800000;">3306</span><span style="color: #800000;">'</span>,<span style="color: #008000;">#</span><span style="color: #008000;">你的数据库端口</span>
<span style="color: #000000;">
}
}
注意:
USER和PASSWORD分别是数据库的用户名和密码。
设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。
然后,启动项目,会报错:no module named MySQLdb
这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL
所以,我们只需要找到项目名文件下的init,在里面写入:
<span style="color: #0000ff;">import<span style="color: #000000;"> pymysql
pymysql.install_as_MySQLdb()
问题解决!
二、ORM表模型
表(模型)的创建:
实例:我们来假定下面这些概念,字段和关系
作者模型:一个作者有姓名。
作者详细模型:把作者的详情放到详情表,包含性别,email地址和出生日期,作者详情模型和作者模型之间是一对一的关系(one-to-one)(类似于每个人和他的身份证之间的关系),在大多数情况下我们没有必要将他们拆分成两张表,这里只是引出一对一的概念。
出版商模型:出版商有名称,地址,所在城市,省,国家和网站。
书籍模型:书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many),也被称作外键。
django.db models
= models.CharField(max_length=30,verbose_name== models.CharField(,max_length=50= models.CharField(,max_length=60= models.CharField(max_length=30= models.CharField(max_length=50=</span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Meta:
verbose_name </span>= <span style="color: #800000;">'</span><span style="color: #800000;">出版商</span><span style="color: #800000;">'</span><span style="color: #000000;">
verbose_name_plural </span>=<span style="color: #000000;"> verbose_name
</span><span style="color: #0000ff;">def</span> <span style="color: #800080;">__str__</span><span style="color: #000000;">(self):
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> self.name
<span style="color: #0000ff;">class<span style="color: #000000;"> Author(models.Model):
name = models.CharField(max_length=30<span style="color: #000000;">)
<span style="color: #0000ff;">def <span style="color: #800080;">str<span style="color: #000000;">(self):
<span style="color: #0000ff;">return<span style="color: #000000;"> self.name
<span style="color: #0000ff;">class<span style="color: #000000;"> AuthorDetail(models.Model):
sex = models.BooleanField(max_length=1,choices=((0,<span style="color: #800000;">'<span style="color: #800000;">男<span style="color: #800000;">'),(1,<span style="color: #800000;">'<span style="color: #800000;">女<span style="color: #800000;">'<span style="color: #000000;">),))
email =<span style="color: #000000;"> models.EmailField()
address = models.CharField(max_length=50<span style="color: #000000;">)
birthday =<span style="color: #000000;"> models.DateField()
author =<span style="color: #000000;"> models.OneToOneField(Author)
<span style="color: #0000ff;">class<span style="color: #000000;"> Book(models.Model):
title = models.CharField(max_length=100<span style="color: #000000;">)
authors =<span style="color: #000000;"> models.ManyToManyField(Author)
publisher =<span style="color: #000000;"> models.ForeignKey(Publisher)
publication_date =<span style="color: #000000;"> models.DateField()
price=models.DecimalField(max_digits=5,decimal_places=2,default=10<span style="color: #000000;">)
<span style="color: #0000ff;">def <span style="color: #800080;">str<span style="color: #000000;">(self):
<span style="color: #0000ff;">return self.title
分析代码:
<1> 每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交互的方法。并提供了一个简介漂亮的定义数据库字段的语法。
<2> 每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。
<3> 模型之间的三种关系:一对一,一对多,多对多。
一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个UNIQUE=True的属性;
一对多:就是主外键关系;(foreign key)
多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key)
1、ORM之增(create,save)
app01.models *
<span style="color: #008000;">#</span><span style="color: #008000;">create方式一: Author.objects.create(name='Alvin')</span>
<span style="color: #008000;">#</span><span style="color: #008000;">create方式二: Author.objects.create(**{"name":"alex"})</span>
<span style="color: #008000;">#</span><span style="color: #008000;">save方式一: author=Author(name="alvin")</span>
<span style="color: #000000;"> author.save()
</span><span style="color: #008000;">#</span><span style="color: #008000;">save方式二: author=Author()</span>
author.name=<span style="color: #800000;">"</span><span style="color: #800000;">alvin</span><span style="color: #800000;">"</span><span style="color: #000000;">
author.save()</span></pre>
重点来了------->那么如何创建存在一对多或多对多关系的一本书的信息呢?(如何处理外键关系的字段如一对多的
和多对多的authors)
<span style="color: #008000;">#</span><span style="color: #008000;">方式一: 由于绑定一对多的字段,比如publish,存到数据库中的字段名叫publish_id,所以我们可以直接给这个</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> 字段设定对应值:</span>
Book.objects.create(title=<span style="color: #800000;">'</span><span style="color: #800000;">php</span><span style="color: #800000;">'</span><span style="color: #000000;">,publisher_id</span>=2,<span style="color: #008000;">#</span><span style="color: #008000;">这里的2是指为该book对象绑定了Publisher表中id=2的行对象</span>
publication_date=<span style="color: #800000;">'</span><span style="color: #800000;">2017-7-7</span><span style="color: #800000;">'</span><span style="color: #000000;">,price</span>=99<span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;">方式二:</span>
<span style="color: #008000;">#</span><span style="color: #008000;"> <1> 先获取要绑定的Publisher对象:</span>
pub_obj=Publisher(name=<span style="color: #800000;">'</span><span style="color: #800000;">河大出版社</span><span style="color: #800000;">'</span>,address=<span style="color: #800000;">'</span><span style="color: #800000;">保定</span><span style="color: #800000;">'</span>,city=<span style="color: #800000;">'</span><span style="color: #800000;">保定</span><span style="color: #800000;">'</span><span style="color: #000000;">,state_province</span>=<span style="color: #800000;">'</span><span style="color: #800000;">河北</span><span style="color: #800000;">'</span>,country=<span style="color: #800000;">'</span><span style="color: #800000;">China</span><span style="color: #800000;">'</span>,website=<span style="color: #800000;">'</span><span style="color: #800000;">http://www.hbu.com</span><span style="color: #800000;">'</span><span style="color: #000000;">)
OR pub_obj</span>=Publisher.objects.get(id=1<span style="color: #000000;">)
</span><span style="color: #008000;">#</span><span style="color: #008000;"> <2>将 publisher_id=2 改为 publisher=pub_obj</span>
Book.objects.create(title=<span style="color: #800000;">'
<span style="color: #800000;">php<span style="color: #800000;">'<span style="color: #000000;">,publisher=pub_obj,<span style="color: #008000;">#<span style="color: #008000;">添加的为出版社对象时不使用**_id了。
publication_date=<span style="color: #800000;">'<span style="color: #800000;">2017-7-7<span style="color: #800000;">'<span style="color: #000000;">,price=99)
<span style="color: #008000;">#</span><span style="color: #008000;">方式一:</span>
<span style="color: #008000;">#</span><span style="color: #008000;">取出要添加的作者对象列表,通过一本书籍的<ManyToManyDescriptor object> .add方法添加作者对象。</span>
<span style="color: #000000;">
author1
=Author.objects.get(id=1<span style="color: #000000;">)
author2=Author.objects.filter(name=<span style="color: #800000;">'<span style="color: #800000;">alvin<span style="color: #800000;">'<span style="color: #000000;">)[0]
book=Book.objects.get(id=1<span style="color: #000000;">)
book.authors.add(author1,author2)
<span style="color: #008000;">#<span style="color: #008000;">等同于:
book.authors.add(
<span style="color: #000000;">[author1,author2])
book.authors.remove(<span style="color: #000000;">[author1,author2])
<span style="color: #008000;">#<span style="color: #008000;">-------------------
<span style="color: #008000;">#<span style="color: #008000;">方式二:
<span style="color: #008000;">#<span style="color: #008000;">取出要添加的书籍对象列表,通过一个作者对象的.book_set.add(
book)添加书籍对象。
book=models.Book.objects.filter(id__gt=1<span style="color: #000000;">)
authors=models.Author.objects.filter(id=1<span style="color: #000000;">)[0]
authors.book_set.add(<span style="color: #000000;">book)
authors.book_set.remove(*<span style="color: #000000;">book)
<span style="color: #008000;">#<span style="color: #008000;">-------------------
<span style="color: #008000;">#<span style="color: #008000;">方式三:取出书籍或者作者对象,直接添加对应的id.
<span style="color: #000000;">
book.authors.add(1) <span style="color: #008000;">#<span style="color: #008000;">book.authors.add(1,2) 可一次添加多个id,已存在的id不会重复添加
book.authors.remove(1<span style="color: #000000;">)
authors.book_set.add(1<span style="color: #000000;">)
authors.book_set.remove(1<span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;">注意: 如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式<span style="color: #008000;">
<span style="color: #008000;"> 如果第三张表是自己创建的:
<span style="color: #0000ff;">class</span><span style="color: #000000;"> Book2Author(models.Model):
author</span>=models.ForeignKey(<span style="color: #800000;">"</span><span style="color: #800000;">Author</span><span style="color: #800000;">"</span><span style="color: #000000;">)
Book</span>= models.ForeignKey(<span style="color: #800000;">"</span><span style="color: #800000;">Book</span><span style="color: #800000;">"</span><span style="color: #000000;">)
<span style="color: #008000;">#<span style="color: #008000;"> 那么就还有一种方式:
author_obj=models.Author.objects.filter(id=2<span style="color: #000000;">)[0]
book_obj =models.Book.objects.filter(id=3<span style="color: #000000;">)[0]
s</span>=models.Book2Author.objects.create(author_id=1,Book_id=2<span style="color: #000000;">)
s.save()
s</span>=models.Book2Author(author=author_obj,Book_id=1<span style="color: #000000;">)
s.save()</span></pre>