django-5-使用数据库
Posted hardykay
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 增加数据有两种方式 2 3 方式1 4 5 b = Person(name=”姓名“,age=年龄) 6 b.save() 7 8 9 方式二 10 11 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()
1 # 查询相关API: 2 3 # <1>filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 4 5 # <2>all(): 查询所有结果 6 7 # <3>get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 8 9 #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()-------- 10 11 # <4>values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 model的实例化对象,而是一个可迭代的字典序列 12 13 # <5>exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 14 15 # <6>order_by(*field): 对查询结果排序 16 17 # <7>reverse(): 对查询结果反向排序 18 19 # <8>distinct(): 从返回结果中剔除重复纪录 20 21 # <9>values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 22 23 # <10>count(): 返回数据库中匹配查询(QuerySet)的对象数量。 24 25 # <11>first(): 返回第一条记录 26 27 # <12>last(): 返回最后一条记录 28 29 # <13>exists(): 如果QuerySet包含数据,就返回True,否则返回False。
2、一对多
创建数据库:
1 from django.db import models 2 class Publisher(models.Model): 3 name = models.CharField(max_length=30, verbose_name="名称") 4 address = models.CharField("地址", max_length=50) 5 city = models.CharField(‘城市‘,max_length=60) 6 state_province = models.CharField(max_length=30) 7 country = models.CharField(max_length=50) 8 website = models.URLField() 9 10 11 def __str__(self): 12 return self.name 13 14 15 class Book(models.Model): 16 title = models.CharField(max_length=100) 17 publisher = models.ForeignKey("Publisher") 18 publication_date = models.DateField() 19 price=models.DecimalField(max_digits=5,decimal_places=2,default=10) 20 21 def __str__(self): 22 return self.title
publisher = models.ForeignKey("Publisher")就是建立外键关联。
增:
1 #一对多(ForeignKey): 2 3 #方式一: 由于绑定一对多的字段,比如publish,存到数据库中的字段名叫publish_id,所以我们可以直接给这个 4 # 字段设定对应值: 5 Book.objects.create(title=‘php‘, 6 publisher_id=2, #这里的2是指为该book对象绑定了Publisher表中id=2的行对象 7 publication_date=‘2017-7-7‘, 8 price=99) 9 10 11 #方式二: 12 # <1> 先获取要绑定的Publisher对象: 13 pub_obj=Publisher(name=‘河大出版社‘,address=‘保定‘,city=‘保定‘, 14 state_province=‘河北‘,country=‘China‘,website=‘http://www.hbu.com‘) 15 OR pub_obj=Publisher.objects.get(id=1) 16 17 Book.objects.create(title=‘php‘, 18 publisher=pub_obj, #将 publisher_id=2 改为 publisher=pub_obj 19 publication_date=‘2017-7-7‘, 20 price=99)
3、多对多
1 from django.db import models<br> 2 class Publisher(models.Model): 3 name = models.CharField(max_length=30, verbose_name="名称") 4 address = models.CharField("地址", max_length=50) 5 city = models.CharField(‘城市‘,max_length=60) 6 state_province = models.CharField(max_length=30) 7 country = models.CharField(max_length=50) 8 website = models.URLField() 9 10 class Meta: 11 verbose_name = ‘出版商‘ 12 verbose_name_plural = verbose_name 13 14 def __str__(self): 15 return self.name 16 17 class Author(models.Model): 18 name = models.CharField(max_length=30) 19 def __str__(self): 20 return self.name 21 22 class AuthorDetail(models.Model): 23 sex = models.BooleanField(max_length=1, choices=((0, ‘男‘),(1, ‘女‘),)) 24 email = models.EmailField() 25 address = models.CharField(max_length=50) 26 birthday = models.DateField() 27 author = models.OneToOneField(Author) 28 29 class Book(models.Model): 30 title = models.CharField(max_length=100) 31 authors = models.ManyToManyField(Author) 32 publisher = models.ForeignKey(Publisher) 33 publication_date = models.DateField() 34 price=models.DecimalField(max_digits=5,decimal_places=2,default=10) 35 def __str__(self): 36 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()
删:
1 Book.objects.filter(id=1).delete() 2 #我们表面上删除了一条信息,实际却删除了三条,因为我们删除的这本书在Book_authors表中有两条相关信息,这种删除方式就是django默认的级联删除。
同步数据库 (将写好的数据表写入数据库)
# Django 1.6.x 及以下
python manage.py syncdb
# Django 1.7 及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate
参考:https://www.cnblogs.com/yuanchenqi/articles/6083427.htm
以上是关于django-5-使用数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Toad for Oracle 中使用自定义代码片段?
如何使用 Swift 使用此代码片段为 iOS 应用程序初始化 SDK?