django orm
django orm
一、django orm简介
orm不会自动创建库,只能自动创建表,所以数据库必须要提前创建好
1、orm对象关系
类 --> 表
对象 --> 记录
属性 --> 字段值
2、orm作用
更为简单的操作数据。能够让一个不会数据库操作的小白也能够通过python面向对象语法 句点符来简单快捷的操作数据
3、如何写模型类
首先需要先去对应的应用下的models.py中书写模型类
models.py文件中需要写的东西,例:
class User(models.Model): id = models.AutoField(primary_key=True) # 主键值,自动增长 name = models.CharField(max_length=32) # varchar类型 password = models.IntegerField() # int类型 create_time = models.DateField(auto_now_add=True) # 时间类型 """ auto_now=True : 每次修改数据的时候,都会自动将最新的更新记录下来 auto_now_add=True : 只在创建数据的时候将创建时间自动记录下来,之后不会自动改变 """ class Book(models.Model): # 当你没有指定主键的时候, django orm会自动帮你创建一个名为id的主键字段,一旦检测到你自己创建了主键字段,那么就不会再帮你创建 name = models.CharField(max_length=32) password = models.IntegerField()
写完模型类之后,要记得执行数据库迁移(同步)命令,同步表到数据库(可以在pycharm下的Terminal窗口下执行)。
python manager.py makemigrations # 仅仅是将你对数据库的改动记录到某个文本上(migrations文件夹) python manager.py migrate # 将改动真正的同步到数据库中 # 上面两个命令永远都是成对出现的,只要执行了第一条,就一定要执行第二条 # 只要动了models.py中跟数据库相关的代码,你就必须要重新执行上面的两条命令来保证数据库与models.py保持一致
执行完成之后,数据库中会自动生成数据表
二、使用orm对字段、数据的进行增删查改
1、字段的增删改
增:两种方式
第一种:给该字段设置默认值
# 新增一个邮箱字段,设置默认值 email = models.EmailField(default='123@qq.com')
第二种:让该字段允许为空
# 新增一个爱好字段,允许为空 hobbies = models.CharField(null=True, max_length=255)
改:
直接修改models.py中的字段代码,然后执行数据库迁移命令即可
删(了解):
直接修改models.py中的字段代码,将字段属性注释掉或删掉,执行数据库迁移命令就会将对应的字段以及数据信息全部删除(慎用)
2、数据的增删改查
增:两种方式
第一种方式(推荐):create()方法
# 方式一:直接朝数据库中添加数据 # 直接朝数据库中添加数据 user_obj = models.User.objects.create(name=username, password=password) print(user_obj.password, user_obj.name)
第二种方式:对象的绑定方法
# 1 先生成一个user对象 user_obj = models.User(name=username, password=password) # 2 调用对象的绑定方法 user_obj.save()
查:
条件查询:filter()方法,括号内传入参数
res = models.User.objects.filter(name=username) # 原生sql语句:select * from user where username='tom' # filter()该方法返回的结果可以看成是一个列表套对象的形式 # QuerySet支持索引取值但是不支持负数,并且 也不推荐直接索引取值,推荐使用封装好的方法first() user_obj = res.first() # filter方法条件不存在的时候,不会报错,返回的是一个空列表
取所有:两种方法
第一种方式:filter()方法,括号内不传参数
users_obj = models.User.objects.filter() print(users_obj) # <QuerySet [<User: jack>, <User: tom>, <User: roll>, <User: back>]>
第二种方式:all()方法
users_obj = models.User.objects.all() print(users_obj) # <QuerySet [<User: jack>, <User: tom>, <User: roll>, <User: back>]>
改:两种方式
第一种方式(推荐):update方法
models.User.objects.filter(id=edit_id).update(name=username, password=password)
第二种方式(了解):调用对象的绑定方法
# 1 先获取数据对象 edit_obj = models.User.objects.filter(id=edit_id).first() # 2 再修改对象属性 edit_obj.name = username edit_obj.password = password # 3 调用对象的绑定方法保存 edit_obj.save()
写个例子:
# 1、先获取用户想要修改的数据id edit_id = request.GET.get('edit_id') if request.method == 'POST': # 获取用户修改后用户名和密码 username = request.POST.get('username') password = request.POST.get('password') # 修改数据(推荐使用) 方式一: 批量更新 models.User.objects.filter(id=edit_id).update(name=username, password=password) # 修改数据(了解) 方式二: # 1 先获取数据对象 # edit_obj = models.User.objects.filter(id=edit_id).first() # 2 再修改对象属性 # edit_obj.name = username # edit_obj.password = password # 3 调用对象的绑定方法保存 # edit_obj.save() return redirect('/home') # 2、根据id获取数据对象,并且展示到html页面上 edit_obj = models.User.objects.filter(id=edit_id).first() return render(request, 'edit_user.html', {'edit_obj': edit_obj})
删:
delete()方法
models.User.objects.filter(id=delete_id).delete() # 将filter过滤出来的数据全部删除
三、使用orm创建表关系
1、表关系的三种类型
① 一对多
② 多对多
③ 一对一
2、如何分析表关系
以图书管理系统为例,图书管理系统有以下几张表:
书籍表(book):name、price
出版社表(publish)
作者表(author)
作者详情表(author_detail)
表与表之间的关系:
书籍和出版社:一对多(一本书只能由一个出版社出版,一个出版社可以出版多本书籍)
一对多外键关系,外键字段建立在多的一方
书籍和作者:多对多(一本书可以由多个作者写作,一个作者可以写多本书)
多对多外键关系,外键字段无论建立在哪一方都可以,外键字段推荐建在查询频率比较高的一方(方便orm查询)
作者与作者详情:一对一(一个作者对应一个作者详情)
一对一外键关系,外键字段无论建立在哪一方都可以,外键字段推荐建在查询频率比较高的一方(方便orm查询)
PS:在书写表关系的时候,要先把基表全部写出来,之后再考虑外键字段
""" ForeignKey和OneToOneField字段,在创建表的时候orm会自动该字段加上_id的后缀,无论创建时候有没有加 publish = models.ForeignKey(to='Public') # 默认关联字段就是出版社表的主键字段 authors_detail = models.OneToOneField(to='AuthorsDetail') """