数据库的配置
1 django默认支持sqlite,MysqL,oracle,postgresql数据库。
<1> sqlite
django默认使用sqlite的数据库,默认自带sqlite的数据库驱动,引擎名称:django.db.backends.sqlite3
<2> MysqL
2 MysqL驱动程序
MysqLdb(MysqL python) 对python2支持比较好
MysqLclient
PyMysqL(纯python的MysqL驱动程序) 对python3支持好
3 在django的项目中会默认使用sqlite数据库,在settings里有如下设置:
创建数据库 python manage.py makemigrations
更新数据库 python manage.py migrate
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.MysqL', 'NAME': 'books', #你的数据库名称 'USER': 'root', #你的数据库用户名 'PASSWORD': '', #你的数据库密码 'HOST': '', #你的数据库主机,留空默认为localhost 'PORT': '3306', #你的数据库端口 } }
no module named MysqLdb报错解决方法:
这是因为django默认你导入的驱动是MysqLdb,可是MysqLdb对于py3有很大问题,所以我们需要的驱动是PyMysqL。
import pyMysqL pyMysqL.install_as_MysqLdb()
使用小技巧:
字段别名
# 应用软件/models.py
class Book(models.Model): name = models.CharField(max_length=30,verbose_name='书名') price = models.IntegerField('价格')
ORM
单表操作:
# 第一种
b =Book(name='python基础',price=99,author='lily',pub_date='2017-02-02') b.save()
# 第二种
Book.objects.create(name='python基础', price=99, author='yuan', pub_date='2017-02-02')
数据表修改
# 第一种 推荐使用
Book.objects.filter(author='lily').update(price=999)
# 第二种
b = Book.objects.filter(author='lily') b[0].price = 100 b[0].save()
数据表删除
Book.objects.filter(author='lily').delete()
数据表查询
filter(**kwargs) 包含于筛选条件想相匹配的对象
all() 查询所有结果
get(**kwargs) 返回筛选条件相匹配的对象,返回结果只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
下面方法都是对查询的结果进行二次处理:比如objects.filter.values()
value(*filed) 返回一个ValueQuerySet,一个特殊的QuerySet,运行后得到的并不是一系列model实例化对象,而是一个可迭代的字典序列
excluds(**kargs) 包含于所给刷选条件不匹配的对象
order_by(*field) 对查询结果排序
reverse() 对查询结果反向排序
distinct() 从返回结果中剔除重复记录
values_list(*field) 与values()非常相似,但是返回的是一个元组序列,values返回的是一个字典序列
count() 返回数据库中匹配查询(QuerySet)的对象数量
first() 返回第一条记录
last() 返回最后一条记录
exists() 如果匹配查查包含数据,则返回True,否则返回False
模糊查询(双下划线)
__lt 小于
__gt 大于
多表操作之一对多
查询记录(通过对象)
book_obj = Book.objects.get(name='python基础') print(book_obj.publish.name) # 书籍对象对应的出版社对象 print(book_obj.publish.city) print(type(book_obj.publish)) --------------------------- 北京大学出版社 北京 <class 'app.models.Publish'>
2 反向查询
查询人民出版社出国的所有书籍名字和价格示例
# 正向查询
pub_obj = Publish.objects.filter(name='人民出版社')[0] res = Book.objects.filter(publish=pub_obj).values('name','price') print(res)
# 反向查询
pub_obj = Publish.objects.filter(name='人民出版社')[0] res1 =pub_obj.book_set.all().values('name','price') # book_set 是Publish的外键 print(res1) ------------------------------------------------------------------------------------ <QuerySet [{'price': 33, 'name': 'java'}, {'price': 22, 'name': 'python'}]>
3.查询记录方法: filter().values() 双下划线(推荐写法)
# 查询人民出版社所属的书籍名字和价格 res2 = Book.objects.filter(publish__name='人民出版社').values('name','price') print(res2) --------------------------------------------------------------------------- <QuerySet [{'price': 33, 'name': 'python'}]>
# 查询python这本书的出版社名字
res3 = Publish.objects.filter(book__name='python').values('name') print(res3)
# 查询python这本书的出版社名字
res4 = Book.objects.filter(name='python').values('publish__name') print(res4) ------------------------------------ <QuerySet [{'name': '人民出版社'}]>
# 查询属于北京出版社的所有书的名字
res5 = Book.objects.filter(publish__city='北京').values('name') print(res5) ---------------------------------------------------------- <QuerySet [{'name': 'python基础'}, {'name': 'liunx运维'}]>
res6 = Book.objects.filter(pub_date__lt='2017-06-01',pub_date__gt='2017-01-01').values('name') print(res6) ------------------------------------------------------------------------------------------------ <QuerySet [{'name': 'python基础'}, {'name': 'liunx运维'}, {'name': 'java'}, {'name': 'python'}]>
注意:publish__name 中publish是Book表中外键名
多表操作(多对多)
创建多对多关系 authors = models.ManyToManyField('Author')
Q和filter混合使用
from django.db.models import Q res = Book.objects.filter(Q(name='Go'), price=77) print(res)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。