3、ORM基本使用

一、Django ORM

ORM:对象关系映射 作用:能够让一个不用sql语句的小白也能够通过python面向对象的代码简单快捷的操作数据库 不足之处:封装程度太高 有时候sql语句的效率偏低,还是需要自己写sql语句

1、ORM创建表的命令

类=表,对象=记录,对象属性=记录某个字段的值

我们先去应用文件夹下的models.py中书写一个类,类名对应表名

class User(models.Model): 
    id = models.AutoField(primary_key=True,verbose_name='主键')
    username = models.CharField(max_length=32,verbose_name='用户名')
    password = models.IntegerField(verbose_name='密码')
    # 以上三句话相当于原生SQL的这三句话
    # id int primary_key auto_increment
    # username varchar(32)
    # password int
    
    """
    CharField必须要指定max_length参数,不指定会直接报错
    verbose_name该参数是所有字段都应该有的,就是用来对字段的解释
    
    由于一张表中必须要有一个主键字段,所以ORM在我们不定义主键字段时,默认帮我们创建了一个叫做id的主键字段
    也就意味着后续我们在创建模型表的时候如果主键字段名没有额外的叫法,那么主键字段可以省略不写
    """

2、数据库迁移命令

只要你修改了models.py中跟数据库相关的代码,就必须在终端重新执行下面的两条命令

python manage.py makemigrations 
# 将操作记录记录到小本本上(migrations文件夹)

python manage.py migrate  
# 将操作真正的同步到数据库中

3、ORM中对数据库操作的增删改查

(1)字段的增删改查

'''字段的增加,必须要给字段填入值,否则增加不了,下面有三种情况解决'''

# 1.当表中已经有数据时,根据终端的提示,在终端内直接给出默认值

# 2.该字段可以为空
info = models.CharField(max_length=32,verbose_name='个人简介',null=True)

# 3.直接给字段设置默认值
hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='学习')

#############################################################################

'''字段的删除'''
# 直接注释对应的字段然后执行数据库迁移的两条命令即可!执行完毕之后字段对应的数据也都没有了

#############################################################################

'''字段的修改'''
# 直接修改代码然后执行数据库迁移的两条命令即可!

(2)数据的增删改查

# 数据的查询
user_queryset = models.User.objects.all()  # 查看User表的所有数据

res = models.User.objects.filter(数据库字段名=数据库的数据名)  # 按括号内的条件查询
'''
res返回的值:<QuerySet [<User: User object>]>
返回值你先看成是列表套数据对象的格式
它也支持索引取值,切片操作,但是不支持负数索引
它也不推荐你使用索引的方式取值,
现在先简单介绍数据的增删改查,后面的表查询笔记我们再详细介绍表的查询
'''

#############################################################################

# 数据的增加
# 第一种:
res = models.User.objects.create(数据库字段名=数据库的数据名)
# 第二种:
user_obj = models.User(数据库字段名=数据库的数据名)
user_obj.save()  # 保存数据

#############################################################################

# 数据的修改(pk:主键字段)
models.User.objects.filter(pk=3).update(数据库字段名=修改数据名)

#############################################################################

# 数据的删除
res = models.User.objects.filter(pk=2).delete()

二、ORM创建表关系

首先我们回顾一下mysql中是如何创建表关系的表之间的关系
表与表之间无非三种关系:一对多,多对多,一对一

我们就拿之前MySQL用的作者和图书之间的多对多关系,再加上一个出版社表来形成上述三种关系的例子

很明显,我们可以看出:
图书和出版社是一对多的关系 外键字段建在多的那一方
图书和作者是多对多的关系 需要创建第三张表来专门存储
作者与作者详情表是一对一
了解完了表关系,那在ORM中我们用代码来实现
首先是创建表,然后再添加外键

# 书籍表
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8,decimal_places=2)  # 总共八位 小数点后面占两位
    # 图书和出版社是一对多,并且书是多的一方 所以外键字段放在书表里面
    publish = models.ForeignKey(to='Publish')  # 默认就是与出版社表的主键字段做外键关联    
    """
    如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
    如果你自作聪明的加了_id那么orm还是会在后面继续加_id,后面在定义ForeignKey的时候就不要自己加_id
    """
	# 图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
    authors = models.ManyToManyField(to='Author')
    """
    authors是一个虚拟字段,主要是用来告诉orm,书籍表和作者表是多对多关系,让orm自动帮你创建第三张关系表
    """

# 出版社表
class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

# 作者表
class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # 作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
    author_detail = models.OneToOneField(to='AuthorDetail')
	# OneToOneField也会自动给字段加_id后缀,所以你也不要自作聪明的自己加_id

# 作者详情表
class AuthorDetail(models.Model):
    phone = models.BigIntegerField()  # 或者直接字符类型
    addr = models.CharField(max_length=32)

以上的ORM命令只是初步的介绍,详细的我们后面会写的更加详细,现在只是大致了解一下基础

三、Django生命周求请求图

posted @ 2021-05-24 20:11  黑影Poco  阅读(81)  评论(0)    收藏  举报