Django(三)

ORM的概念

        1. 什么是ORM?
            关系映射对象
            # 不但在python中有,在其他语言中也有
        2. 特点:
            在操作数据库的时候,不用在写原生SQL语句
            '''相对而言,执行效率低了'''
        3. ORM书写的位置:
            在models.py文件中
        4. 如何使用?
            类名    >>>   表名
             对象    >>>   记录
             属性    >>>    字段
         5. 如何来创建表?
            # 创建一张表出来,必须继承models
        class User(models.Model):
            # 组合索引,联合索引
            # id int primary key auto_increment
            id = models.IntegerField(primary_key=True)

            # username, max_length必须写
            username = models.CharField(max_length=32)  # varchar(32)

            # password, orm支持自定义数据类型
            password = models.CharField(max_length=32)  # char()

        6. 类写完之后,一定要执行数据库迁移命令,才能真正的创建出来数据表
            '''
                python36 manage.py makemigrations
                python36 manage.py migrate
            '''
            # 凡是跟数据相关的操作都要执行以上两句话

        # 补充:ORM不能创建数据库,必须提前把库创建完成

字段的增删改查

         '''
                如果你的表有主键,并且主键名也叫id,那么可以省略不写,自动创建
                如果你的主键名不叫id,那么,就需要指定了
        '''
        # 创建一张表出来,必须继承models
        class User(models.Model):
            # 组合索引,联合索引
            '''
                如果你的表有主键,并且主键名也叫id,那么可以省略不写,自动创建
                如果你的主键名不叫id,那么,就需要指定了
            '''
            # id int primary key auto_increment
            id = models.IntegerField(primary_key=True)

            # username, max_length必须写
            username = models.CharField(max_length=32)  # varchar(32)

            # password, orm支持自定义数据类型
            password = models.CharField(max_length=32)  # char() 

ORM数据的增删改查

        # 增加数据
            # sql: insert into t1 ()...
            # ORM:
            # 第一种方式
            # res=models.User.objects.create(username='ly', password=123)
            '''
                返回值是当前插入的数据对象
            '''
            # print(res.username)

            # 第二种方式:
            # obj=models.User(username='ly1', password=123)
            # obj.save() # 这句话才是真正的操作数据


            # 修改:第一种方式
            # sql:update db1 set username = '', password = '' where id=1 and ...
            # orm:
            # models.User.objects.filter(id=1).update(username='LY')
            # models.User.objects.filter(pk=1).update(username='LY')

            '''返回值是影响的行数'''

            # 第二种方式
            # res = models.User.objects.filter(pk=1).all()[0]
            # filter里面的条件是and关系
            # res = models.User.objects.filter(pk=1, username='aaaa11').first()  # [0]
            # res = models.User.objects.filter(pk=1).first()  # [0]
            # res = models.User.objects.filter(username='aaaa').filter(password=123).all()  # [0]
            '''只要返回值是QuerySet对象,那么,就可以一直点queryset提供的方法'''
            # print(res) # <QuerySet [<User: User object>]>
            # print(res.username)
            # print(res.password)
            # res.username = 'aaaa'
            # res.save()

            # 删除:delete from user where id = 1
            models.User.objects.filter(pk=1).delete()

ORM创建表关系

        # mysql是关系型数据库

        一对一:
            '''外键字段建在任何一方都可以,但是,推荐建在使用频率比较高的一张表'''
        一对多
            '''
                外键字段建在多的一方
            '''
        多对多
            '''
                外键字段不建在任何一张表,而是,建在第三张表中
            '''
        eg:

            图书表
            出版社表
            作者表
            作者详情表

            '''
                图书和出版社是一对多,图书是多,出版社是一
                图书和作者是多对多的关系
                作者和作者详情表是一对一
            '''

            # 不常用的数据我们称之为冷数据,
            # 常用的数据我们称之为热数据
         # ORM创建表关系
        # 1. 先创建这张表的基础字段,
        # 2. 在回头创建外键字段

        # 出版社表

        class Book(models.Model):
            title = models.CharField(max_length=32)
            '''
                float
                double
                decimal(5, 2) 999999.99
            '''
            # decimal(8, 2)
            price = models.DecimalField(max_digits=8, decimal_places=2)
            # publish_id = models.ForeignKey(to='Publish', to_field='id')
            publish_id = models.ForeignKey(to='Publish')  # 如果关联的是id字段,那么可以省略不写
            # publish_id = models.ForeignKey(to=Publish)  # 如果关联的是id字段,那么可以省略不写

            authors = models.ManyToManyField(to='Author')
            '''
                authors是一个虚拟字段,不会真正的在book表中创建出来这个字段
                这个字段是关联第三张表的
            '''
        class Publish(models.Model):
            addr = models.CharField(max_length=32)


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

            author_detail = models.OneToOneField(to='AuthorDetail')
        # 作者详情表
        class AuthorDetail(models.Model):
            phone = models.CharField(max_length=32)
posted @ 2022-03-02 19:16  丶祈安  阅读(19)  评论(0编辑  收藏  举报