一、修改
方式一:模型類的對象.屬性 = 更改的屬性值,模型類的對象.save()
返回值:編輯的模型類的對象。
def update_book(request):book = models.Book.objects.filter(pk=1).first()book.price = "169"book.save()return HttpResponse(book.price)
方式二:修改數據 方法二:QuerySet 類型數據.update()。
返回值:整數,受影響的行數。推薦使用方式?
def update_book2(request):books = models.Book.objects.filter(pk__in=[2, 3]).update(price="169")return HttpResponse(books)
二、刪除:
方式一:使用模型類的?對象.delete()。
返回值:元組,第一個元素為受影響的行數。
下面的方法中取出第一個對象進行刪除
def delete_book(request):books = models.Book.objects.filter(pk=1).first().delete()print(books)
方式二:使用QuerySet類型數據的?.delete()。
返回值:元組,第一個元素為受影響的行數。
下面的方法中查詢出符合條件的數據進行刪除
def delete_book2(request):books = models.Book.objects.filter(pk__in=[2, 3]).delete()print(books)
注意事項:
- Django 在刪除數據時默認會進行級聯刪除(CASCADE),也就是刪除一個對象時也會刪除與它相關聯的外鍵對象,但這取決于在模型字段上設置的?
on_delete
?參數。 - 方式二delete() 方法是 QuerySet 數據類型的方法,想要刪除所有數據,需要寫 all。
books=models.Book.objects.delete() # 報錯books=models.Book.objects.all().delete() # 刪除成功
三、拓展:刪除策略
on_delete
?參數詳解
1.?models.CASCADE
?(級聯刪除,默認值)
當父表記錄被刪除時,同時刪除所有關聯的子表記錄。
示例:
from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=200)# 默認就是 CASCADEauthor = models.ForeignKey(Author, on_delete=models.CASCADE)# 等同于:# author = models.ForeignKey(Author) # 不寫 on_delete 時默認就是 CASCADE
2.?models.PROTECT
?(保護模式)
阻止刪除操作,如果存在關聯的子表記錄。
示例:
class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.PROTECT)
3.?models.SET_NULL
?(設為空)
當父表記錄被刪除時,將外鍵字段設為 NULL(需要字段允許為空)。
class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True, blank=True)
4.?models.SET_DEFAULT
?(設為默認值)
當父表記錄被刪除時,將外鍵字段設為默認值。
class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.SET_DEFAULT, default=1)
5.?models.SET()
?(設為指定值)
當父表記錄被刪除時,將外鍵字段設為指定的值或調用函數。
def get_default_author():return Author.objects.get_or_create(name="未知作者")[0].idclass Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.SET(get_default_author))
6.?models.DO_NOTHING
?(不采取任何動作)
數據庫級別不進行任何操作(需要在數據庫層面設置約束)
class Book(models.Model):title = models.CharField(max_length=200)author = models.ForeignKey(Author, on_delete=models.DO_NOTHING)