Django之ORM
阿新 • • 發佈:2022-02-25
什麼是ORM
ORM全稱是:Object Relational Mapping(物件關係對映),其主要作用是在程式設計中,把面向物件的概念跟資料庫中表的概念對應起來。舉例來說就是,我定義一個物件,那就對應著一張表,這個物件的例項,就對應著表中的一條記錄。
在操作資料庫時,不用再寫SQL語句就能操作資料庫。
使用ORM建立表的操作
在應用的models.py裡操作
# 建立表
class User(models.Model):
# 建立欄位
# id = models.AutoField(primary_key=True, verbose_name='主鍵')
username = models.CharField(primary_key=True, max_length=32, verbose_name='使用者名稱')
password = models.IntegerField(verbose_name='密碼')
# gender = models.CharField(max_length=32, verbose_name='性別')
# hobby = models.CharField(max_length=32, default='red', verbose_name='愛好')
# age = models.IntegerField(null=True,verbose_name='年齡')
PS: 如果你的主鍵名時id時,可以不寫,django會自動幫你建立一個主鍵名為id的欄位,並且自增,字串欄位的max_length必須寫,否則會報錯,verbose_name是該欄位的註釋。
程式碼寫好之後,在命令列中輸入 python3 manage.py makemigrations 這是建立遷移記錄
python3 manage.py migrate 這一步才是建立表
也可以在 tools =》 RUN manage.py TASK中輸入命令,在這裡面前綴可以不加,直接寫後面的程式碼即可,pycharm還會有提示功能
使用ORM對錶的增刪改查
和建立表一樣,直接再models.py中操作,增加欄位就使用上面的操作,修改表直接修改表裡的程式碼即可,刪除將程式碼註釋掉即可
注意!對資料庫進行操作之後,想要儲存修改後的表必須在命令列中輸入python3 manage.py makemigrations和python3 manage.py migrate
只有輸入了這兩個命令,表的操作才會被修改。
使用ORM對資料的增刪改查
增
# 第一種方式 # models.表名.object.create(欄位名1=資料1,欄位名2=資料2) res=models.User.objects.create(username='jack', password=123) ''' 返回值是當前插入的資料物件 ''' # 第二種方式 res=models.USER(username='jack',password=123) res.save()
查
# 查詢所有資料,返回一個列表,列表裡可以看作是一個個物件,可以使用索引取得物件 res=models.User.object.filter().all.() res=models.User.object.filter() # 查詢欄位名username='jack'的資料列表 res=models.User.object.filter(username='jack') # 獲得欄位名為id=1的資料物件 #方式1 obj=models.User.object.filter(id=1).first() #方式2 obj=models.User.object.filter(id=1)[0]
改
# 查詢資料庫中欄位名username為jack的資料,將該行的資料改成username改成jerry,password改成123 res = models.User.objects.filter(username='jack').update(username=jerry, password=123) #該返回值是資料庫影響的行數
刪
# 查詢資料庫中欄位名username為jack的資料,將改行資料刪除 models.User.objects.filter(username=jack).delete()
ORM建立表關係
一對多(在多的表中書寫)
# 關聯欄位名 = models.ForeignKey(to='另一張表的關聯欄位名')
publish_id = models.ForeignKey(to='Publish') # 如果關聯的是id欄位,那麼可以省略不寫
一對一(在任意一張表中書寫即可)
# 關聯欄位名 = models.OneToOneField(to='被關聯欄位名') author_detail = models.OneToOneField(to='AuthorDetail')
多對多
# 關聯欄位名 = models.ManyToManyField(to='被關聯欄位名') authors = models.ManyToManyField(to='Author')