Django ORM
连接数据库
使用PyCharm连接数据库
如果不在django中指定要使用的数据库,那么django中默认连接sqlite的数据库 该数据库功能不是很强大,尤其是对日期类型格式的数据,不是很兼容
django连接MySQL的两步配置
-
在settings文件中配置
DATABASES = { 'default':{ 'ENGINE':'django.db.backemds.mysql', 指定使用MySQL数据库 'NAME':'xxx', 指定MySQL中的指定库 'USER':'root', 用户名 'PASSWORD':'xxxxxx' 连接数据库的密码 'HOST':'127.0.0.1' 默认地址 'PORT':3306, 端口号 'CHARSET':'utf8' 使用的编码格式 } }
-
由于django默认使用的是mysqldb模块来连接数据库 但是改模块不兼容 不推荐使用告诉django使用pymysql模块连接数据库
###在项目名的文件夹找到__init__文件或者在自己定义的应用名文件夹下的__init__都可以指定 import pymysql pymysql.install_as_MySQLdb()
-
Django orm使用
我们在django中使用orm时,orm并不会帮你自动创建数据库,还是需要我们手动指定一个django项目用一个数据库
ORM对象关系映射
表的创建
在应用名下的models.py中书写模型类
orm中常用字段
AutoField(primary_key = True) 用于设置主键
CharField(max_length = re) 用于设置字符类型的字段,必须要有max_length参数
IntegerField() 用于设置数字类型字段
BigIntergerField() 用于设置可以存放大个的数字类型
DateField() 用于设置日期字段
auto_now:每次修改数据时,都会更新该字段
auto_now_add:只在创建数据的时候 才会自动将创建时间添加 后续不会自动修改
BooleanField(field)
-波尔类型值
在使用该字段存储数据的时候,你只需要传递布尔值
在数据库中会自动变为0/1
TextField(Field) 文本类型,用于存放大字段
EmailField(CharField) 用于存放邮箱
FileField(Field)
-字符串,路径保存在数据库
-参数:
upload_to = "" 上传文件保存的路径
storage = None 存储组件,默认django.core.files.FileSystem
DecimalField(Field)
-10进制小数
-必须设置的参数:
max_digits 小数总长度
decimal_places 小数位长度
orm表创建
在应用名下的models.py中书写模型类
class User(models.Model):
id = model.AutoField(primary_key = Ture) #为表设置主键,在django中 你可以不指定主键字段,rom会自动为你创建id的主键字段
username = model.CharField(max_length=32) #设置username字段
***********************************数据库迁移命令**************************************
1.python.manage.py makemigrations #并不会真正操作数据 只是将记录记录到小本本上
2.python manage.py migrate #将真正的记录同步到数据库中
# 当你第一次执行上面两条命令的时候 django会自动创建很多张表 这些表都是django默认需要用到的表
# 你自己写的模型类所对应的表 表名有固定格式
应用名_表名
如何查看使用ORM时,内部得真正得sql语句
方案一
在settings文件中配置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}}
方案二
- 如果时queryset对象,可以直接点query查看
ps:只要时queryset对象就可以无限制的店queryset对象的方法
如何在单个py文件下测试ORM
在test.py下面
1. import os
2.if __name__ == "__main__"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "one_search.settings")
import django
django.setup()
#这样即可测试django中的py文件
ORM增删改查
单表操作
查
单表查询:
ORM查询之必知必会13条
-
all()
查询所有惰性查询,不打印不传值
-
filter()
模糊查询 -
get()
数据本身 -
first()
第一个 -
last()
最后一个 -
exclude()
除此之外 -
values()
列表套字典 -
values_list()
列表套元组 -
count()
统计数据的个数 -
distinct()
去重 -
order_by()
排序,默认升序,加负号就是降序 -
reverse()
必须先进行排序才可以反转 -
exists()
可以不用记
ORM查询之双下滑线查询
res = models.Book.objects.filter(price__gt = 200)
查询价格大于200的书籍res = models.Book.objects.filter(price__lt = 200)
查询价格小于200的书籍res = models.Book.objects.filter(price__gte = 200)
查询价格大于等于200的书籍res = models.Book.objects.filter(price__lte = 200)
查询价格小于等于200的书籍res = models.Book.objects.filter(price__in = [200,123,23,666.66])
价格是200或123,或23,或666.66的书籍res = models.Book.objects.filter(price__range = (200,666.66)
顾头不顾尾,查询价格在200到700之间的书籍res = models.Book.objects.filter(title__contains = 'p')
查询书籍名称中包含p的res = models.Book.objects.filter(title__icontains = 'p')
忽略大小写,只要包含p的都查询出来res = models.Book.objects.filter(title__startswith = '三')
查询书籍以三开头的res = models.Book.objects.filter(title__endswith = '三')
查询书籍以三结尾的res = models.Book.objects.filter(publish_date__year = '2019')
查询出版日期是2019的书籍
增
models.Book.objects.create(title='瓜皮之书',price = 200,publish_date='2019-10-24')
book_obj = models.Book.(title='瓜皮之书',price = 200,publish_date='2019-10-24')
book_obj.save()
删除
models.Book.objects.filter(pk=1).delete()
改
-
models.Book.objects.filter().update()
-
#先查对象 book_obj = models.Book.objects.filter(pk=1).first() #给属性赋值 book_obj.title = '不符合社会主义核心价值观' 使用方法保存 book_obj.save()
多表操作
ORM之多表操作之增
增
# models.Book.objects.create(title='三国演义',price=123.23,publish_id=1) # publish_id直接传出版社主键值
# publish_obj = models.Publish.objects.filter(pk=2).first()
# models.Book.objects.create(title='水浒传',price=123.23,publish=publish_obj) # publish直接传出版社数据对象