1. 程式人生 > 其它 >Django(三)

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)