Python學習---django之ORM文法[對象關係映射]180124

來源:互聯網
上載者:User

標籤:china   ural   問題   --   block   lap   py3   不用   複雜   

ORM文法[對象關係映射]

ORM: 用物件導向的方式去操作資料庫的建立表以及增刪改查等操作。

優點:1 ORM使得我們的通用資料庫互動變得簡單易行,而且完全不用考慮該死的SQL語句。快速開發。

         2 可以避免一些新手程式猿寫sql語句帶來的效能問題。

缺點:1  效能有所犧牲,不過現在的各種ORM架構都在嘗試各種方法,比如緩衝,消極式載入登來減輕這個問題。

         2  對於個別複雜查詢,ORM仍然力不從心,為瞭解決這個問題,ORM一般也支援寫raw sql。

         3  通過QuerySet的query屬性查詢對應操作的sql語句

              author_obj=models.Author.objects.filter(id=2)

              print(author_obj.query)

建立表[class類建立表]:

一對一: OnetoOne

一對多: ForeignKey[外鍵在多的那個類/表中]

多對多: Manytomany

ORM操作

建立表[class類建立表]:
    一對一: OnetoOne
    一對多: ForeignKey[外鍵在多的那個類/表中]
    多對多: Manytomany
動作表[行對象]:
    增:
        create: 
            單表增加1
                    models.Book.objects.create(name=‘FTL‘)
            單表增加2【推薦】
                    dict={‘name‘:‘FTL‘}
                         models.Book.objects.create(**dict)  # 接收傳遞過來的字典
            一對多表增加1【外鍵publish】
                    models.Book.objects.create(name=‘FTL‘, publish_id=2) # 直接添加id
            一對多表增加2【外鍵publish,推薦根據對象添加】
                    publisher=models.Publish.objects.get(id=2)
                    # 添加單個對象,非集合【否則就變成了多對多】
                    models.Book.objects.create(name=‘FTL‘, publish=publisher)
               多對多【推薦對象添加】
                    publisher=models.Publish.objects.get(id=2)
                    publisher1=models.Publish.objects.get(id=3)
                    book=models.Book.objects.get(id=2)
                    book.add(publish,publish1)
                    或者方向添加: author.book_setadd(*books) [books是列表]
        save:
            單表建立1、book = Book(name=‘FTL‘)
                          book.save();
            單表建立2、book = Book()
                          obj.name=‘FTL‘
                          ojb.save()
               多表建立同上create()
   刪: delete, remove, clear
    改: update, save
    查:filter, get

建立表模型:

/blog/models.py

# --------------------------------ORM學習------------------------from django.db import modelsclass Publish(models.Model):    id = models.AutoField(primary_key=True)    name = models.CharField(‘名稱‘, max_length=64)    city = models.CharField(‘所在城市‘, max_length=64)    province = models.CharField(‘省份‘, max_length=30, default=‘BJ‘)    country = models.CharField(‘國家‘, max_length=33, default=‘CHINA‘)    website = models.CharField(‘網址‘, max_length=30, default="WWW")    class Meta:        verbose_name=‘出版社‘        verbose_name_plural = verbose_name  # plural 複數的    def __str__(self):        return self.nameclass Author(models.Model):    name = models.CharField(‘姓名‘, max_length=30)    def __str__(self):        return self.nameclass AuthorDetail(models.Model):    sex = models.BooleanField(max_length=1, choices=((0, ‘男‘), (1, ‘女‘)))    email = models.EmailField(‘郵箱‘, max_length=12)    birthday = models.DateField()    author = models.OneToOneField(Author,on_delete=models.CASCADE,)class Book(models.Model):    title = models.CharField(max_length=64, verbose_name="標題")    price = models.DecimalField(max_digits=5, decimal_places=2, default=10)    page_num = models.IntegerField(null=True,editable=False) # Djangog預設可修改    # 注意是添加了引號的類,如果不添加,則需要把類放在該類的前面[否則Py解譯器找不到]    author = models.ManyToManyField(‘Author‘, default=‘FTL‘)     # 1本書有多個作者    # author = models.ManyToManyField(Author, default=‘FTL‘)     # Author類必須在Book之前    #外鍵屬性,django在建立表單時候會預設將publish改為publish_id[外鍵在多的那一方建立]    publish = models.ForeignKey(‘Publish‘, on_delete=models.CASCADE, default=1,)    publish_date = models.DateField(default=‘2020-20-20‘)    def __str__(self):        return self.title

執行命令,建立表單:

python manage.py makemigrations  # 會在blog下migrations檔案夾下產生一個Python檔案                                       # F:\Django\mysite2\blog\migrations\auto_20180125_0737.pypytyon manage.py migrate         # 真正去資料庫裡面建立表 

建表成功:

分析代碼:
  <1>  每個資料模型都是django.db.models.Model的子類,它的父類Model包含了所有必要的和資料庫互動的方法。並提供了一個簡介漂亮的定義資料庫欄位的文法。
  <2>  每個模型相當於單個資料庫表(多對多關係例外,會多產生一張關係表),每個屬性也是這個表中的欄位。屬性名稱就是欄位名,它的類型(例如CharField)相當於資料庫的欄位類型(例如varchar)。大家可以留意下其它的類型都和資料庫裡的什麼欄位對應。
  <3>  模型之間的三種關係:一對一,一對多,多對多。
一對一:實質就是在主外鍵(author_id就是foreign key)的關係基礎上,給外鍵加了一個UNIQUE=True的屬性;
一對多:就是主外鍵關係;(foreign key)
多對多:(ManyToManyField) 自動建立第三張表(當然我們也可以自己建立第三張表:兩個foreign key)

問題解決

遇到的問題1:

問題現象:表欄位無預設值報錯,建表失敗

問題解決: 添加屬性預設值,Py3新增加

遇到的問題2:

問題現象:外鍵沒有設定串聯刪除,建表失敗

問題解決: 添加串聯刪除,on_delete=models.CASCADE,

Python學習---django之ORM文法[對象關係映射]180124

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.