orm:对象关系映射
对象关系映射简单说:就是通过操作对象的方式,去操作数据库。不需要写大量原生的sql语句就可以完成数据的增删改查
映射关系:
类 | 数据库中的表 |
---|---|
对象 | 表单记录 |
对象获取属性 | 记录的某个字段对应的值 |
优点: 能够让一个不会数据库操作的人 也能够简单快捷去使用数据库
缺点: 由于封装程度太高 可能会导致程序的执行效率偏低,有时候 结合项目需求 可能需要你手写sql语句
注意事项:django的orm不会自动帮你创建库,库需要你自己手动创建,表会自动帮你创建 你只需要书写符合django orm语法的代码即可,去应用下所在的models.py中书写类
模型层:应用下的models.py
。
在该文件先写表类继承于odels.Model
,然后去定义属性字段
这里写的类,会到数据库中去创建响应的表(类名),每一个设置的属性,就是一个类中的字段
关于数据库的连接配置请参考:002 Django框架及ORM的基本使用
如果想打印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',
},
}
}
在应用下的tests.py
中
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Django_Stu_Pro.settings")
'''写下面这两句话才可以运行'''
import django
django.setup()
# 你就可以在下面测试django任何的py文件
创建表:
class Signle(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2) # 长度8位,两位小数
publish_date = models.DateField()
# 增: 推荐方式
models.User.objects.create(usr=my_usr, pwd=my_pwd)
# 删: 推荐方式
models.User.objects.filter(usr=my_usr).delete()
# 改: 推荐方式
models.User.objects.filter(usr=my_usr).update(pwd=new_pwd)
'''单表查询:必知必会13条'''
# 1. all() 查询所有 返回:QuerySet对象
res = models.Signle.objects.all() # 惰性查询
# 2.filter()条件查询 返回:QuerySet对象
res = models.Signle.objects.filter(pk=2)
# 3.get()条件查询 返回对象
res = models.Signle.objects.get(pk=2)
# 4.first() 拿第一个 返回对象
res = models.Signle.objects.first()
# 5.last() 最后一个 返回对象
res = models.Signle.objects.last()
# 6.exclude() 除此之外 返回:QuerySet对象
res = models.Signle.objects.exclude(pk=2)
# 7.values() 查询所有该字段值 返回:QuerySet对象, 列表套字典
res = models.Signle.objects.values("name","price")
# 8.values_list() 查询所有该字段值 返回:QuerySet对象, 列表套元祖
res = models.Signle.objects.values_list("name","price")
# 9.count() 统计数据的个数 返回:个数
res = models.Signle.objects.count()
# 10.distinct() 去重,必须完全一样,先查询在去重 返回:QuerySet对象
res = models.Signle.objects.values("name").distinct()
# 11.order_by() 排序 返回:QuerySet对象
res = models.Signle.objects.order_by("price") # 默认升序
res = models.Signle.objects.order_by("-price") # 加负号就是降序
# 12.reverse() 前面必须是先结果排序才可以反转 返回:QuerySet对象
res = models.Signle.objects.order_by("price").reverse()
# 13.exists() 判断存在 返回:布尔值
res = models.Signle.objects.filter(pk=1).exists()
# 查询价格大于200的书籍
res = models.Signle.objects.filter(price__gt=200)
# 查询价格小于200的书籍
res = models.Signle.objects.filter(price__lt=200)
# 查询价格大于或者等于200的书籍
res = models.Signle.objects.filter(price__gte=200)
# 查询价格小于或者等于200的书籍
res = models.Signle.objects.filter(price__lte=200)
# 查询价格是 200 或123.23 或 666.66
res = models.Signle.objects.filter(price__in=[200,123.23,666.66])
# 查询价格在200 到700之间的书籍
res = models.Signle.objects.filter(price__range=[200,666.66]) # 顾头不顾尾
# 查询书籍名称中包含p的
res = models.Signle.objects.filter(name__contains='p') # 区分大小写
res = models.Signle.objects.filter(name__icontains='p') # 忽略大小写
# 查询以什么开头
res = models.Signle.objects.filter(name__startswith="p")
# 查询以什么结尾
res = models.Signle.objects.filter(name__endswith="子")
# 查询 哪年的记录
res = models.Signle.objects.filter(publish_date__year=2019)
# 查询 哪月的记录
res = models.Signle.objects.filter(publish_date__month=10)
# 查询 哪天的记录
res = models.Signle.objects.filter(publish_date__day=24)
原文:https://www.cnblogs.com/XuChengNotes/p/11735718.html