Python學習---django之ORM語法[對象關系映射]180124
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()
刪:
改: update, save
查:filter, get
創建表模型:
/blog/models.py
# --------------------------------ORM學習------------------------ from django.db import models class 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.name class Author(models.Model): name = models.CharField(‘姓名‘, max_length=30) def __str__(self): return self.name class 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.py pytyon 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