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})
update方法

删:

  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')
"""
posted @ 2020-12-05 20:57  chchcharlie、  阅读(117)  评论(0编辑  收藏  举报