Django-ORM

目录

-定义

-使用方法

--models.py

--数据库迁移命令 

-- 注意

-实际操作

--ORM实现字段的增删改查

--ORM实现数据的增删改查

--ORM创建表与表之间的联系


-定义

ORM:对象关系映射

作用:让不懂SQL语句的人也能通过写python代码操作数据库

优势:操作语法简单,提高开发效率

不足:封装程度高,有时SQL语句效率低,需要自己写

ORM会将写的类映射成表,对象映射成记录,对象属性=》某个字段

-使用方法

--models.py

1、去应用文件夹下的model.py中写类,必须继承model.Model

class userinfo02(models.Model):
    id = models.AutoField(primary_key = True, verbose_name = '主键')  # verbose_name字段的解释信息
    # id int primary_key auto_increment
    name = models.CharField(max_length=16, verbose_name= '姓名')
    # name varchar(16) 必须指定max_length
    password = models.IntegerField(verbose_name= '密码')
    # password int

--数据库迁移命令 

2、数据库迁移命令

python manage.py makemigrations
# 自动将迁移记录记录到应用文件夹下的migrations文件夹下

 

但此时还未在MySQL中创建,还需执行以下命令↓ 

python manage.py migrate
# 真正在MySQL中创建数据库,且一次性会产生很多表

 

 

 有些是Django默认产生的表,我们自己创建的表会自动加上app名前缀,以便区分

-- 注意

只要修改了model.py文件下的有关数据库的数据/代码,就必须重写执行数据库迁移命令,没有捷径

-实际操作

--ORM实现字段的增删改查

1、字段的增

直接在类下增加字段代码即可,但倘若一些字段已经有值了而去新增字段:

①在终端选择提供默认值

        

         选择1,然后回车后叫你输入默认值,比如输入18,则迁移后会在数据库中看到字段增加了age且默认值为18

②直接设置字段参数null = True

        info = models.CharField(max_length=32, verbose_name='简介', null=True

 ③直接设置字段的默认值

        hobby = models.CharField(max_length=16, verbose_name='爱好', default='study')

2、字段的删

就把类下的字段注释掉或删掉,再执行数据库迁移命令即可

但删掉后字段的数据就没了,所以一定要细心,不要随意删或注释

3、字段的改

直接在类下修改字段即可,不过改完一定执行数据库迁移命令

4、字段的查

随便看呗 

--ORM实现数据的增删改查

1、数据的增

# 第一种方式
models.userinfo02.objects.create(name=username, password=password)
 
# 第二种方式
user_obj = models.userinfo02(name=username, password=password)
user_obj.save()
 
# example-注册
def reg(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
      from App01 import models  # 必不能忘
        # 第一种方式↓
        # res = models.userinfo02.objects.create(name=username, password=password)
        # print(res, res.name, res.password)
         # 第二种方式↓
        user_obj = models.userinfo02(name=username, password=password)
        user_obj.save()
        return HttpResponse('注册成功')
    return render(request, 'html05 register_and_mysql.html')

2、数据的删

# 拿到要删除的对象id
delete_id = request.GET.get('user_id')
# 删除数据
models.userinfo02.objects.filter(id=delete_id).delete()
"""
上述↑代码其实可以批量删除 当传入id多时
"""

3、数据的改

# 修改数据方式1  
models.userinfo02.objects.filter(id=user_id).update(name=name, password=password)
"""可批量更新 当传入id多个时"""
 
# 修改数据方式2
data_querySet = models.userinfo02.objects.filter(id=user_id).first()
data_querySet.name = name
data_querySet.password = password
data_querySet.save()

4、数据的查

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # print(username, password)
        from App01 import models   # 最好写在最上面,这是为了介绍
        """
        res = models.userinfo02.objects.filter(name = username, password=password)
        # 等价于select * from userinfo02 where name = username and password = password
        # print(res)
        user_obj = res[0]  # 返回一个列表套数据对象[数据对象1,数据对象2,…],用索引0取该对象 但不支持负索引
        """
        user_obj = models.userinfo02.objects.filter(name=username, password=password).first()     # 直接调用封装好的方法得到该对象
        if user_obj.name == username:
            if user_obj.password == password:
                return HttpResponse('登录成功')
            else:
                return HttpResponse('密码错误')
        else:
            return HttpResponse('用户不存在')
    return render(request, 'html04 login_and_mysql.html')

--ORM创建表与表之间的联系

创建表关系,先将基表创建出来,然后再添加外键字段

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2) # 总共5位,小数占2位
    # 外键字段
    publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
    '''
    图书和出版社是一对多,外键字段写在多的一方
    默认就是和出版社表的主键字段做关联
    如果字段对应的是ForeignKey,那么orm会自动在字段后面加_id,后面我们在定义ForeignKey时就不要加_id
    '''
    authors = models.ManyToManyField(to='Author')
    '''
    图书和作者多对多,外键推荐写在查询频率高的一方
    authors是一个虚拟字段,用于告诉orm是多对多关系,orm自动帮你创建第三章表
    '''
 
class Publish(models.Model):
    name = models.CharField(max_length=32)
    address = models.CharField(max_length=64)
 
class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # 外键字段
    author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)
    '''
    作者与作者详情表是一对一关系,外键字段推荐建在查询频率高的一方
    OneToOneField也会自动给外键字段加_id后缀
    '''
 
class AuthorDetail(models.Model):
    phone = models.CharField(max_length=11)
    address = models.CharField(max_length=32)
    email_add = models.EmailField()

 

 

posted @ 2022-10-22 23:26  weer-wmq  阅读(16)  评论(0编辑  收藏  举报