Django框架之模型层 单表操作

一、ORM介绍

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',
        },
    }
}

三、django测试环境搭建

在应用下的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()

4.1 增删改

# 增: 推荐方式
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)

4.2 单表查询之必知必会13条

  1. all()
  2. filter()
  3. get()
  4. first()
  5. last()
  6. exclude()
  7. values()
  8. values_list()
  9. count()
  10. distinct()
  11. order_by()
  12. reverse()
  13. exists()
'''单表查询:必知必会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()

4.3 神奇的双下划线模糊查询

# 查询价格大于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)

猜你喜欢

转载自www.cnblogs.com/XuChengNotes/p/11735718.html