Django——ORM

Django ORM

"""
ORM: 对象关系映射
作用:能够让一个不用sql语句的小白也能够通过python 面向对象的代码简单快捷的操作数据库
不足之处:封装程度太高 有时候sql语句的效率偏低 需要你自己写SQL语句
"""
# 1 先去models.py中书写一个类
	class User(models.Model):
    # id int primary_key auto_increment
    id = models.AutoField(primary_key=True)
    # username varchar(32)
    username = models.CharField(max_length=32)
    # password int
    password = models.IntegerField()

'''************************* 2 数据库迁移命令*************************'''
python3 manage.py makemigrations 将对数据库的操作记录记在migrations文件夹中

python3 manage.py migrate  将操作真正的同步到数据库中
# 只要你修改了models.py中跟数据库相关的代码 就必须重新执行上述的两条命令
'''******************************************************************'''

class User(models.Model):
    # id int primary_key auto_increment
    id = models.AutoField(primary_key=True,verbose_name='主键')
    # username varchar(32)
    username = models.CharField(max_length=32,verbose_name='用户名')
    """
    CharField必须要指定max_length参数 不指定会直接报错
    verbose_name该参数是所有字段都有的 就是用来对字段的解释
    """
    # password int
    password = models.IntegerField(verbose_name='密码')


class Author(models.Model):
    # 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段
    # 当表中不定义主键时ORM会自动帮我们创建一个名为id的主键字段
    # username varchar(32)
    username = models.CharField(max_length=32)
    # password int
    password = models.IntegerField()

字段的增删改查

# 字段的增加
    1.可以在终端内直接给出默认值
    2.该字段可以为空
    	info = models.CharField(max_length=32,verbose_name='个人简介',null=True)
    3.直接给字段设置默认值
    	hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
 
# 字段的修改
	直接修改代码然后执行数据库迁移的两条命令即可!
        python3 manage.py makemigrations
        python3 manage.py migrate

# 字段的删
	直接注释对应的字段然后执行数据库迁移的两条命令即可!
  执行完毕之后字段对应的数据也都没有了
  
"""
在操作models.py的时候一定要细心
	千万不要注释一些字段
	执行迁移命令之前最好先检查一下自己写的代码
"""

数据的增删改查


查找数据

# 方式一:
user_obj = models.User.objects.filter(username=username).first() # 推荐
"""
res = models.User.objects.filter(username=username)
返回值暂且可以看成是列表套数据对象的格式,支持索引取值(不支持负索引)跟切片操作

filter括号内可以携带多个参数 参数与参数之间默认是and关系,类似sql语句中的where
"""

# 方式二:
user_queryset = models.User.objects.all() # 返回值是一个quertset对象暂且当作列表套对象的格式


添加数据

from app01 import models
res = models.User.objects.create(username=username,password=password)
# 返回值就是当前被创建的对象本身

# 第二种增加
user_obj = models.User(username=username,password=password)
user_obj.save()  # 保存数据

修改数据

#1、告诉后端,用户想要编辑哪条数据(利用url问号后面携带参数的方式)
#	<a href="/edit_user/?user_id={{ user_obj.id }}" 
#		class="btn btn-primary btn-xs">编辑</a>
#2、后端查询出用户想要编辑的数据对象 展示到前端页面供用户查看编辑
	def edit_user(request):
		edit_id = request.GET.get('user_id')
		edit_obj = models.User.objects.filter(id=edit_id).first()
		if request.method == 'POST':
			username = request.POST.get('username')
			password = request.POST.get('password')
			# 方式一
			models.User.objects.filter(id=edit_id)
				.update(username=username,password=password) # 推荐
             '''
             会将filter查询出来的列表中的所有对象全部更新(批量更新操作)
             '''
             # 方式二
             edit_obj.username=username
             edit_obj.password=password
             edit_obj.save()
             '''
             当字段特别多是效率非常低
             从头到尾将数据的所有字段全部更新一边 无论该字段是否被修改
             '''

删除数据

'''注意:实际开发中并不会真的将数据进行删除,我们点的删除仅仅只是将数据隐藏了'''
# 删除功能与编辑有点类似
#<a href="/delete_user/?user_id={{ user_obj.id }}" 
#		class="btn btn-danger btn-xs">删除</a>
def delete_user(request):
    delete_id = request.GET.get('user_id')
    models.User.objects.filter(id=delete_id).delete() # 批量删除
    
'''删除功能应该需要一个二次确认,防止用户误删,后面再做讲解'''

ORM创建表间关系

'''
表间关系:无关系、一对一、一对多、多对多 
判断表间关系的方法:换位思考

publish = models.ForeignKey(to='Publish')  # 默认就是与Publish表的主键字段做外键关联
authors = models.ManyToManyField(to='Author')
author_detail = models.OneToOneField(to='AuthorDetail')
'''
# 图书模型类(Book表)
class Book(models.Model):
    book_name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=8, decimal_places=2) # 总共8位,小数点后占两位
    # book表与publish表为一对多关系,外键建在多的一边
    # orm会自动在字段后面加_id(即字段publish_id)
    publish = models.ForeignKey(to='Publish') 
    # book表与author表为多对多关系,外键建任意一方都可以,推荐建在查询频率高的一边
    # authors是一个虚拟字段,用来告诉orm是多对多关系让orm创建多对多关系表
    authors = models.ManyToManyField(to='Author')


# 出版社模型类(Publish表)
class Publish(models.Model):
    publish_name = models.CharField(max_length=50)
    publish_addr = models.CharField(max_length=100)


# 作者模型类(Author表)
class Author(models.Model):
	author_name = models.CharField(max_length=30)
    author_email = models.EmailField()
    # Author表与AuthorDetail表为一对一关系,外键建任意一方都可以,推荐建在查询频率高的一边
    # orm会自动在字段后面加_id(即字段author_detail_id)
    author_detail = models.OneToOneField(to='AuthorDetail')


# 作者详情模型类(AuthorDetail表)
class AuthorDetail(models.Model):
    phone = models.CharField(max_length=13)
    author_addr = models.CharField(max_length=100)

    
'''
1、在django1.X版本中外键默认都是级联更新删除的
2、多对多的表关系可以有好几种创建方式 这里暂且先介绍一种
3、针对外键字段里面的其他参数 暂时不要考虑
'''

django请求生命流程图(重点)

img

posted @ 2020-05-26 15:49  群青-Xi  阅读(178)  评论(0编辑  收藏  举报