• Django ORM


    Django ORM

    ​ ORM是对象关系映射,Django ORM描述了数据模型类和数据库之间的映射关系,就是让一个类和一个数据库表进行对应,这使ORM在数据库层和业务逻辑层之间起到了桥梁的作用。Django ORM通过统一格式的业务逻辑代码操作数据库,把SQL语句统一转换为较为固定的Django语法结构。Django ORM能够避免一些重复的工作,在ORM模式下开发人员不需要写SQL语句,可以只关注业务逻辑的处理,从而提高开发效率。Django ORM的缺点是操作数据库的语法与SQL语句有很大差别,需要记住很多特殊语句。Django ORM本质上是对SQL语句功能的封装,最终还是转化成SQL来操作数据库。
    ​ Django ORM与数据库映射的关系是一个数据模型映射成一个数据库表。类映射成数据库表,类的属性映射成数据库表字段,类的实例映射成数据行。Django ORM的功能有生成数据库表,操作数据库表的数据行,但是不能够创建数据库。
    ​ Django ORM使用步骤:
    (1)创建数据库;
    (2)在配置文件settings.py中设置数据库连接字符;
    (3)在应用程序的models.py文件中编写继承了models.Model的数据模型;
    (4)运行python manage.py makemigrationspython manage.py migrate两个命令生成数据库表;
    (5)使用Django ORM操作数据库表。

    1. Django ORM字段类型

    (1)CharField,字符类型,必须提供字符长度max_length参数,verbose_name参数为字段别名,在SQL层面没有具体的体现。
    (2)EmailField,邮箱类型,实际上也是字符类型,只是提供了邮箱格式检验。
    (3)TextField,文本类型,存储大文本字符串。
    (4)IntegerField,整数类型。
    (5)DateField,日期类型。
    (6)TimeField,时间字段。
    (7)DateTimeField,日期时间字段,结合了日期与时间。
    (8)FileField,实际是字符串类型,把上传的文件路径保存在数据库中。
    (9)ImageField,实际是字符串类型,用来把上传的图片路径保存在数据库中。

    # auto_now自动存储当前时间,一般表示最后修改时间,auto_now_add记录创建时间
    date = models.DateField(auto_now=True, auto_now_add=False)
    # upload_to指定上传文件的保存路径
    filetest = models.FileField(upload_to='test/')
    
    • 1
    • 2
    • 3
    • 4
    1. 常用字段属性

    (1)db_index:True表示设置这个字段为数据库表的索引。
    (2)unique:True表示字段在数据库表中不能有重复值。
    (3)default:设置默认值。
    (4)auto_now_add:True表示把创建时间。
    (5)auto_now:True表示更新时间。

    1. 基本数据操作

    (1)增加记录

    #通过数据模型的objects属性提供数据操作的接口
    #方法1
    new_emp= models. employee.objects.create(name="tom",email="tom@163.com",dep_id=66)
    #方法2
    new_emp= models.employee (name= "tom",email="tom@163.com",dep_id=66)
    new_emp.save()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (2)删除记录

    # 使用filter过滤出符合条件的记录
    models.employee.objects.filter(name= "张三").delete()
    
    • 1
    • 2

    (3)修改记录

    # 将指定条件的记录更新,并更新指定字段的值
    models.employee.objects.filter(name='tom').update(email="tom2@163.com")
    # 修改单条数据
    obj = models.employee.objects.get(id=66)
    obj.email = "tom2@sina.com"
    obj.save()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (4)查询

    # 获取全部
    Emp_list= models.employee.objects.all()
    # 获取单条数据,数据不存在则报错
    Emp=models.employee.objects.get(id=123)
    # 获取指定条件的记录集
    Emp_group=models.employee.objects.filter(name= "张三")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 数据操作常用函数

    (1)all函数,返回符合条件的全部记录;

    objects = models.employee.objects.all()
    
    • 1

    (2)filter函数,返回指定条件的记录;

    # 字段名+双下划线+条件名词
    models.employee.objects.filter(name__contains="Tom")
    
    • 1
    • 2

    (3)exclude函数,返回不符合括号内条件的记录;

    models.employee.objects.exclude(name__contains="Tom")
    
    • 1

    (4)order_by函数,按照指定字段排序;

    # 字段名加负号表示倒序,默认正序
    objects = models.employee.objects.exclude(name='tom').order_by('-name','id')
    
    • 1
    • 2

    (5)distinct函数,去除重复记录;

    models.employee.objects.filter(name="Tom").distinct()
    
    • 1

    (6)values函数,返回一个字典类型序列;

    objects = models.employee.objects.values('id','name','email')
    
    • 1

    (7)values_list函数,返回一个元组类型序列;

    objects = models.employee.objects.values_list('id','name','email')
    
    • 1

    (8)get、first、last函数返回单个对象。

    # 返回id为1的记录,括号内是过滤条件
    object1 = models.employee.objects.get(id=1)
    # 返回数据集的第一条记录
    object2 = models.employee.objects.first()
    # 返回数据集的最后一条记录
    object3 = models.employee.objects.last()
    # 返回数据集的个数
    object4= models.employee.objects.count()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    1. 示例
    # 创建了员工数据模型、部门数据模型、团体数据模型、员工补充信息模型
    class employee(models.Model):
        name = models.CharField(max_length=32, verbose_name='姓名')
        email = models.EmailField(verbose_name='邮箱')
        # 部门与员工是一对多的关系,有外键的表是多,外键关联表是一。
        dep = models.ForeignKey(to='department', on_delete=models.CASCADE)
        # 员工和团体是多堆垛的关系
        group = models.ManyToManyField(to='group')
        salary = models.DecimalField(max_digits=8, decimal_places=2)
        # 员工与员工信息是一对一的关系
        info = models.OneToOneField(to='employeeinfo', 
                                    on_delete=models.CASCADE, null=True)
    
    class department(models.Model):
        dep_name = models.CharField(max_length=32, verbose_name='部门名称')
        dep_script = models.CharField(max_length=60, verbose_name='备注')
    
    class group(models.Model):
        group_name = models.CharField(max_length=32, verbose_name='团体名称')
        group_script = models.CharField(max_length=60, verbose_name='备注')
    
    class employeeinfo(models.Model):
        phone = models.CharField(max_length=11)
        address = models.CharField(max_length=50)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    这 10 种架构师,不合格!
    基于springboot实现java学习平台项目【项目源码+论文说明】计算机毕业设计
    Linux自动化运维工具ansible详解
    科技与教育的盛宴——探讨监控易在82届教装展的新机遇
    博客系统(页面设计)
    WinRAR功能之【自动加密】
    启山智软/一款包含主流商城类型的一款电商中台系统100%开源
    ps2022 - add text
    Qt的线程(两种QThread类的详细使用方式)「建议收藏」
    【IDEA】在工具栏设置快速创建包和类的图表
  • 原文地址:https://blog.csdn.net/dolly_baby/article/details/126776059