加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Django Models和ORM框架

发布时间:2020-12-15 17:13:32 所属栏目:大数据 来源:网络整理
导读:数据库的配置 1? ? django默认支持sqlite,mysql,oracle,postgresql数据库。 ? ? ?1 sqlite ? ? ? ? ? ? django默认使用sqlite的数据库,默认自带sqlite的数据库驱动,引擎名称:django.db.backends.sqlite3 ? ? ?2 mysql ? ? ? ? ? ? 引擎名称:django.db.back

数据库的配置

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)


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读