Python学习笔记--使用Django修改和删除数据

一、修改

方式一:模型类的对象.属性 = 更改的属性值,模型类的对象.save()

**返回值:**编辑的模型类的对象。

python 复制代码
def update_book(request):
    book = models.Book.objects.filter(pk=1).first()
    book.price = "169"
    book.save()
    return HttpResponse(book.price)

方式二:修改数据 方法二:QuerySet 类型数据.update()。

返回值:整数,受影响的行数。推荐使用方式

python 复制代码
def update_book2(request):
    books = models.Book.objects.filter(pk__in=[2, 3]).update(price="169")
    return HttpResponse(books)

二、删除:

**方式一:**使用模型类的 对象.delete()。

**返回值:**元组,第一个元素为受影响的行数。

下面的方法中取出第一个对象进行删除

python 复制代码
def delete_book(request):
    books = models.Book.objects.filter(pk=1).first().delete()
    print(books)

**方式二:**使用QuerySet类型数据的 .delete()。

**返回值:**元组,第一个元素为受影响的行数。

下面的方法中查询出符合条件的数据进行删除

ruby 复制代码
def delete_book2(request):
    books = models.Book.objects.filter(pk__in=[2, 3]).delete()
    print(books)

注意事项:

  • Django 在删除数据时默认会进行级联删除(CASCADE) ,也就是删除一个对象时也会删除与它相关联的外键对象,但这取决于在模型字段上设置的 on_delete 参数。
  • 方式二delete() 方法是 QuerySet 数据类型的方法,想要删除所有数据,需要写 all。
python 复制代码
books=models.Book.objects.delete()  # 报错

books=models.Book.objects.all().delete()   # 删除成功

三、拓展:删除策略

on_delete 参数详解

1. models.CASCADE (级联删除,默认值)

当父表记录被删除时,同时删除所有关联的子表记录。

示例:

python 复制代码
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=200)
    # 默认就是 CASCADE
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    
    # 等同于:
    # author = models.ForeignKey(Author)  # 不写 on_delete 时默认就是 CASCADE

2. models.PROTECT (保护模式)

阻止删除操作,如果存在关联的子表记录。

示例:

python 复制代码
class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.PROTECT)

3. models.SET_NULL (设为空)

当父表记录被删除时,将外键字段设为 NULL(需要字段允许为空)。

python 复制代码
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 (设为默认值)

当父表记录被删除时,将外键字段设为默认值。

python 复制代码
class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.SET_DEFAULT, default=1)
  1. models.SET() (设为指定值)

当父表记录被删除时,将外键字段设为指定的值或调用函数。

python 复制代码
def get_default_author():
    return Author.objects.get_or_create(name="未知作者")[0].id

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.SET(get_default_author))

6. models.DO_NOTHING (不采取任何动作)

数据库级别不进行任何操作(需要在数据库层面设置约束)

python 复制代码
class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.DO_NOTHING)
相关推荐
鄃鳕26 分钟前
python 字典 列表 类比c++【python】
c++·python
im_AMBER26 分钟前
算法笔记 05
笔记·算法·哈希算法
可触的未来,发芽的智生32 分钟前
新奇特:黑猫警长的纳米世界,忆阻器与神经网络的智慧
javascript·人工智能·python·神经网络·架构
程序员三藏39 分钟前
Jmeter接口测试与压力测试
自动化测试·软件测试·python·测试工具·jmeter·接口测试·压力测试
烛阴1 小时前
用 Python 揭秘 IP 地址背后的地理位置和信息
前端·python
大宝剑1701 小时前
python环境安装
开发语言·python
Element_南笙1 小时前
吴恩达新课程:Agentic AI(笔记2)
数据库·人工智能·笔记·python·深度学习·ui·自然语言处理
倔强青铜三2 小时前
苦练Python第69天:subprocess模块从入门到上瘾,手把手教你驯服系统命令!
人工智能·python·面试
倔强青铜三2 小时前
苦练 Python 第 68 天:并发狂飙!concurrent 模块让你 CPU 原地起飞
人工智能·python·面试
星期天要睡觉2 小时前
深度学习——循环神经网络(RNN)实战项目:基于PyTorch的文本情感分析
人工智能·python·rnn·深度学习·神经网络