Python学习笔记--使用Django修改和删除数据
一、修改
方式一:模型类的对象.属性 = 更改的属性值,模型类的对象.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)