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. 常用字段属性

(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()

(2)删除记录

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

(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()

(4)查询

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

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

objects = models.employee.objects.all()

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

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

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

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

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

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

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

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

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

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

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

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

(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. 示例
# 创建了员工数据模型、部门数据模型、团体数据模型、员工补充信息模型
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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐江小鱼

知识创造财富,余额还是小数

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值