數(shù)據(jù)庫基本操作
一晕讲、定義模型
-
在models.py中定義一個UserInfo模型
class UserInfo(models.Model): SEX_CHOICES = ( (u'm', u'男'), (u'w', u'女'), ) # 自定義主鍵 uid = models.AutoField(primary_key=True) # 用戶名 username = models.CharField(max_length=64) # 密碼 password = models.CharField(max_length=64) # 手機(jī)號 phone = models.CharField(max_length=11) # 年齡 age = models.IntegerField() # 注冊時間 create_date = models.DateField(auto_now_add=True) # 最后登錄的時間 last_date_time = models.DateTimeField(auto_now=True) # 頭像 pic = models.ImageField(upload_to=user_directory_path) # 性別 sex = models.CharField(max_length=1, choices=SEX_CHOICES) class Meta: db_table = 'user_info' def __str__(self): return self.username
二涯竟、增
1震糖、說明
執(zhí)行一個SQL INSERT INTO 操作,將一個對象保存到數(shù)據(jù)庫
2魁瞪、方式一(save)
-
說明
通過模型對象的save方法
-
方法
Model.save(force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None)
-
參數(shù)說明
-
force_insert(了解,盡量不要使用)
如果為True表示保存時強(qiáng)制insert一條記錄到數(shù)據(jù)庫
-
force_update(了解,盡量不要使用)
如果為True表示保存時強(qiáng)制update更新數(shù)據(jù)
-
using
數(shù)據(jù)庫別名
-
update_fields
默認(rèn)值None,用來指定哪些字段需要更新喷众,別的不更新奋救。默認(rèn)是None恳守,這樣所有字段都會更新一遍稿辙。有時候字段很多而我們只需要更新很少的字段,可以用這個參數(shù)來提高一下效率演侯。注意要給它的是一個可迭代對象(比如list等)炕吸。如果給它一個空的可迭代對象伐憾,那么就什么都不更新(注意和None不同,如果等于None是更新全部字段
-
-
示例代碼
# 注意因為主鍵是自動增長的,所以開發(fā)中千萬不要手動給主鍵字段賦值,由系統(tǒng)生成 user = UserInfo(username='test1', password='123456', phone='110') user.save()
3赫模、方式二(create了解)
-
方法
Model.objects.create(**kwargs)
-
舉個栗子
UserInfo.objects.create(username='test1', password='123456', phone='110') # 或者 UserInfo.objects.create({'username': 'test1', 'password': '123456', 'phone': '110'})
4树肃、批量增加
-
說明
批量插入,
-
函數(shù)
bulk_create(objs, batch_size=None)
-
參數(shù)說明
- objs 批量插入的對象
- batch_size 緩存多少 如果不設(shè)置,batch_size是objs的長度
-
返回值
返回保存好的objs
-
示例代碼
user_list =[user1,user2,user3] user_list = User.objects.bulk_create(user_list)
4、主鍵相關(guān)
-
說明
首先每個模型都有一個AutoField-自動遞增的主鍵 - 當(dāng)我們調(diào)用第一次調(diào)用模型save()方法的時候會自動賦值,
調(diào)用用之前
save()
瀑罗,沒有辦法知道ID的值是什么 胸嘴,這個值不是由django計算生成,而是由底層數(shù)據(jù)庫生成, -
由數(shù)據(jù)庫自動生成主鍵
good = Good.objects.create(good_name='華為mate9', price=3200.00) uid = good.uid # uid=None good.save() uid = good.uid # 返回你的新對象的ID
-
自己指定主鍵值(了解)
good = Good.objects.create(good_name='華為mate9', price=3200.00) good.good_id= 10 good.save()
注意
自己指定主鍵很容易造成主鍵沖突(主鍵唯一性),所以盡量不要在實戰(zhàn)開發(fā)中這么去干,
-
pk
屬性無論你是自己定義還是讓Django 為你提供一個主鍵字段雏掠, 每個模型都將具有一個屬性叫做
pk
。 它其實就是模型的一個普通屬性劣像,但實際上是模型主鍵字段屬性的別名乡话。 可以讀取并設(shè)置它的值,就和其它屬性一樣耳奕,它會更新模型中正確的值good = Good.objects.get(pk=1) print(good)
三绑青、更新
1、說明
執(zhí)行一個SQL UPDATE 操作,將一個對象保存到數(shù)據(jù)庫
2屋群、一般情況的操作步驟
- 先查詢數(shù)據(jù)
- 重新給字段賦值
- 提交數(shù)據(jù)
3时迫、方式一(save)
-
說明
可以通過save方法去更新,唯一不同的必須先從數(shù)據(jù)庫先去查詢該對象,然后修改,在保存
-
示例代碼
user = UserInfo.objects.get(pk=1) user.password = '888' user.save(update_fields=['password']) # 了解 指定id 開發(fā)中中最好不要這么干 # user = UserInfo(uid=1, username='test2', password='123456', phone='110', age=18) # user.save(update_fields=['username', 'password', 'phone', 'age'])
-
SQL語句
UPDATE user_info SET password ='888' WHERE uid = 1
4、方式二(update)
-
說明
利用QuerySet對象的update方法,利用此方法也可以實現(xiàn)批量更新
-
示例代碼
UserInfo.objects.filter(uid=1).update(password='999')
# 如果過濾的條件是多個對象,就是批量更新,就所有用戶的密碼改成999 UserInfo.objects.all().update(password='999')
四谓晌、刪除對象
-
說明
執(zhí)行一個SQL
DELETE
操作。 只會刪除數(shù)據(jù)庫中的對象癞揉;Python實例仍將存在纸肉,并且它的字段中仍然有數(shù)據(jù)。 此方法返回刪除對象的數(shù)量和每個對象類型的刪除數(shù)量的字典
-
方法
delete(using=DEFAULT_DB_ALIAS, keep_parents=False)
-
參數(shù)說明
-
using
數(shù)據(jù)庫別名,多數(shù)據(jù)庫配置時有效,一般情況下不用
-
keep_parents
如果為真喊熟,則不會刪除父模型的數(shù)據(jù)柏肪。繼承情況下有效 一般情況下不用
-
-
示例代碼
try: user = UserInfo.objects.get(pk=1) obj = user.delete() print(obj) except UserInfo.DoesNotExist as e: print(e) print('刪除對象不存在') except UserInfo.MultipleObjectsReturned as e: print('存在多個對象')