Hzangyao

导航

django orm的增删改查 以及django1.x和2.x的区别

ORM对字段的增删改查

# 建一个作者表
class Author(models.Model):
    '''
        如果你以后在创建表的时候,主键就叫id名,那么可以省略不写,orm会自动帮你创建出主键名称为id的字段
        但是,如果你的主键名不叫id,比如叫cid,nid...那么,就不能省略了,就要全写。
        
        所以,以后,我在创建表的时候,id我都不写了,默认使用id
    '''
    name = models.CharField(max_length=32)
    phone = models.CharField(max_length=64)
    
    

数据的增删改查

 # ORM对数据的增删改查
    # 增加
    # 第一种方式,objects组件,封装了很多东西,我们不需要知道里面具体实现了什么

    # res=models.Author.objects.create(name='ly1', phone=120)
    # print(res) # Author object, 魔法 __str__ => 打印对象的时候自动触发
    # print(res.name)
    # print(res.phone)

    # 第二种方式:
    # res = models.Author(name='ly111', phone=119) # 只是生成了对象
    # res.save()  # 才真正的操作数据库

    # 查询
    # sql: select * from author
    # <QuerySet [<Author: ly>, <Author: ly1>, <Author: ly111>]>  # 列表套对象
    # res = models.Author.objects.all()
    # print(res)
    # obj = res[0]
    # print(obj.phone)
    # for obj in res:
    #     print(obj.name)
	models.Author.object.filter(username=u)
    # 查询手机号为120的
    # sql: select * from author where phone=120
    # filter => where
    # res = models.Author.objects.filter(phone=120).all()
    # print(res) # <QuerySet [<Author: Author object>]>
    # print(res[0].phone) # <QuerySet [<Author: Author object>]>

    # 查询手机号是119的,并且name=ly111的
    # sql:select * from author where phone=119 and name='ly111'
    '''filter里面的以逗号隔开是and关系'''
    '''多个filter之间的关系也是and关系'''
    # res = models.Author.objects.filter(name='ly111', phone=119).all()
    # <QuerySet [<Author: Author object>]>
    '''只要返回的结果是queryset对象,那么,就可以一直点queryset提供的方法'''
    '''目前,操作的都是单表,多表以及跨表下节课说'''
    # res = models.Author.objects.filter(name='ly111').filter(phone=119).all()
    # res = models.Author.objects.filter(name='ly111').filter(phone=119)
    # res = models.Author.objects.first()  # 第一条
    # res = models.Author.objects.last()   # 最后一条
    '''我想查询所有记录里面的第一条数据'''
    # print(res[0])
    # print(res)

    # 改
    # 把id=1的数据的phone改为123
    # sql: update author set phone = 123456 where id=1
    # orm:
    # 修改的语句,返回结果是影响的行数
    # res = models.Author.objects.filter(id=1).update(phone=123456) # 1
    # res = models.Author.objects.update(phone=123456) #  3
    # print(res)

    # 第二种方式
    # res = models.Author.objects.filter(id=1).first()
    '''pk意思是按照表的主键查询,pk:primary key, 如果你的主键字段叫cid, nid,...'''
    # res = models.Author.objects.filter(pk=1).first()
    # # res.phone  # 获取
    # res.phone = '123'  # 获取
    # res.name = 'hahahhah'  # 获取
    # res.save()

    # 删除
    # 删除id=1的数据
    # sql: delete from author where id=1
    # orm:
    # res = models.Author.objects.filter(pk=1).delete()
    res = models.Author.objects.delete()
    print(res) # (1, {'app01.Author': 1})  # 影响的行数

模板页面传值

# 补充一个知识
def ab_render(request):
    username = '大宝贝hahahahhhah'
    password = '1234454545'
    age = 18
    # 第一种传参方式
    # return render(request, 'ab_render.html', {'username':username, 'password':password})
    # 第二种传参方式
    # {'username': '大宝贝hahahahhhah', 'request': <WSGIRequest: GET '/ab_render/'>}
    # print(locals()) # 局部名称空间
    # print(globals()) # 局部名称空间
    return render(request, 'ab_render.html', locals())

使用ORM创建外键关系

1. mysql的三种关系
	一对一
    一对多
    多对多
2. 以四张表为例
	2.1 图书表
    2.2 出版社表
    2.3 作者表
    2.4 作者详情表
    
3. 四张表之间的三种关系
'''
	一对一:作者表和作者详情表
		外键字段建在查询较多的一张表
	一对多:图书表和出版社表
		外键字段建在多的一方
	多对多:图书表和作者表
		外键字段不建在任何一张表中,而是创建出第三张表
		
'''
4. ORM创建出来三种关系
5. 在django1.x中,级联更新和级联删除是默认的
6. 在django2.x中,级联更新和级联删除是需要手动指定的

    

创建外键关系表

from django.db import models

# Create your models here.

'''创建外键关系'''

'''创建外键关系表的时候,先创建基础字段,先不要管外键字段'''


# 1. 图书表
class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name='图书标题')
    # price int
    # price = models.IntegerField() # 创建出来int类型
    # price decimal(8, 2)
    '''
        max_digits=None,  代表存储的总长度  
        decimal_places=None, 代表的是存储的小数位
    '''
    price = models.DecimalField(max_digits=8, decimal_places=2, verbose_name='价格')  # 可以存小数

    # 创建和出版社的外键关系, 一对多
    '''如果关联的字段是主键,那么to_field可以省略不写,默认关联的就是主键
        
        另外,如果你关联的不是主键字段,那么这个参数就不能省略,必须显式指定
    '''
    # publish_id = models.ForeignKey(to='Publish', to_field='id')
    # publish_id = models.ForeignKey(to='Publish')
    '''
        当我们创建一对多关系的时候,字段的后缀_id就不要在自己添加了
        而是,自动帮我们添加_id字段
    '''
    # publish_id = models.ForeignKey(to='Publish')
    publish = models.ForeignKey(to='Publish')

    # 建立与作者表的多对多关系
    '''
        authors是一个虚拟字段,不会在Book表中创建出来authors字段,而是,会自定帮助我们创建出来第三张表
        此时的第三张表就是图书与作者之间的关系表
    '''
    authors = models.ManyToManyField(to='Author', )


# 2. 出版社表
class Publish(models.Model):
    '''
        verbose_name:对当前字段进行解释,每个数据类型都有这个参数
    '''
    title = models.CharField(max_length=64, verbose_name='出版社标题')
    addr = models.CharField(max_length=32)


# 3. 作者表
class Author(models.Model):
    name = models.CharField(max_length=32)

    # 与作者详情表建立一对一外键关系
    '''
        当我们创建一对一关系的时候,字段的后缀id就不要在加了,而是默认添加_id的结尾
    '''
    author_detail = models.OneToOneField(to='AuthorDetail')


# 4. 作者详情表
class AuthorDetail(models.Model):
    phone = models.CharField(max_length=64)
    wx = models.CharField(max_length=32)

django2.x中on_delete属性

关于别的属性的介绍

CASCADE:这就是默认的选项,级联删除,你无需显性指定它。
PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
SET(): 自定义一个值,该值当然只能是对应的实体了

posted on 2022-03-24 10:12  Hzangyao  阅读(22)  评论(0编辑  收藏  举报