Django Models和ORM框架
数据库的配置 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)? ? ? ? 对python2支持比较好 ? ?mysqlclient ? ?MySQL ? ?PyMySQL(纯python的mysql驱动程序)? ? 对python3支持好 3? ? ?在django的项目中会默认使用sqlite数据库,在settings里有如下设置: ?如果我们想要更改数据库,需要修改如下: 4.创建数据库和更新数据库命令 ? ? ? ? 创建数据库? ? python manage.py makemigrations?? ? ? ? ? 更新数据库? ? python manage.py migrate? Django MySQL数据库连接设置: 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。 项目名文件下的__init__,在里面写入: # 路径,项目名称/__init__.py 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? ? ? ? 大于 多表操作之一对多 查询记录(通过对象) 1 正向查询代码示例: 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') F查询和Q查询 Q和filter混合使用 from?django.db.models?import?Q res?=?Book.objects.filter(Q(name='Go'),?price=77) print(res) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |