首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

强制Django Admin正确调用.update()而不是.save(),以避免触发用于创建对象的检查

Django Admin是Django框架提供的一个强大的后台管理工具,可以方便地管理网站的数据和功能。在使用Django Admin时,我们可以通过调用.save()方法来保存对象的修改或创建新的对象。然而,有时候我们希望只更新对象的部分属性,而不是保存整个对象,这时就可以使用.update()方法。

.update()方法是Django提供的一个高效的更新数据库记录的方法,它可以直接在数据库层面执行更新操作,而不需要加载整个对象到内存中。相比之下,.save()方法会加载整个对象到内存中,并执行一系列的检查和操作,包括创建对象的检查。

强制使用.update()而不是.save()的主要目的是为了提高性能和减少资源消耗。当我们只需要更新对象的部分属性时,使用.update()可以避免不必要的操作,减少数据库的访问次数和数据传输量,从而提高系统的响应速度和吞吐量。

在Django Admin中,我们可以通过重写模型的save_model()方法来实现强制使用.update()而不是.save()。具体步骤如下:

  1. 打开admin.py文件,找到对应的模型注册代码。
  2. 在模型注册代码中定义一个自定义的ModelAdmin类,并继承自admin.ModelAdmin
  3. 在自定义的ModelAdmin类中重写save_model()方法。
  4. save_model()方法中使用.update()方法来更新对象的属性。

下面是一个示例代码:

代码语言:txt
复制
from django.contrib import admin
from .models import YourModel

class YourModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # 更新对象的属性
        YourModel.objects.filter(pk=obj.pk).update(**form.cleaned_data)

admin.site.register(YourModel, YourModelAdmin)

在这个示例中,我们重写了save_model()方法,并使用.update()方法来更新对象的属性。通过这种方式,我们可以确保在Django Admin中正确调用.update()而不是.save(),从而避免触发用于创建对象的检查。

推荐的腾讯云相关产品:腾讯云数据库MySQL、腾讯云服务器CVM、腾讯云容器服务TKE、腾讯云对象存储COS、腾讯云人工智能AI Lab等。你可以在腾讯云官网上找到这些产品的详细介绍和使用说明。

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

django 1.8 官方文档翻译: 2-3-1 模型实例参考

在调用save() 之前无法知道ID 的值,因为这个值是通过数据库而不是Django 计算。...如果你手工赋值一个自增主键的值,请确保不要使用一个已经存在的主键值!如果你使用数据库中已经存在的主键值创建一个新的对象,Django 将假设你正在修改这个已存在的记录而不是创建一个新的记录。...强制使用INSERT 或UPDATE 在一些很少见的场景中,需要强制save() 方法执行SQL 的 INSERT 而不能执行UPDATE。或者相反:更新一行而不是插入一个新行。...Django 几乎始终会完成正确的事情,覆盖它将导致错误难以跟踪。这个功能只用于高级用法。 使用update_fields 将强制使用类似force_update 的更新操作。...通过将更新基于原始字段的值而不是显式赋予一个新值,这个过程可以避免竞态条件而且更快。Django 提供F 表达式 用于这种类型的相对更新。

1.9K10

37.Django1.11.6文档

旧的算法使用SELECT来判断是否存在需要更新的行。 而新的算法直接尝试使用UPDATE。 在某些少见的情况下,一个已存在行的UPDATE操作对Django不可见。 ...如果您的表单集包含formset.save_m2m(),您还需要调用ManyToManyField,以确保多对多关系正确保存。...如果save_as是True,“保存并添加另一个”将被替换为创建新对象(使用新ID)而不是更新的“另存为”按钮现有的对象。 默认情况下,save_as 设置为False。...请注意,使用此技术时,不会触发m2m_changed信号。 这是因为,就管理而言,through只是一个具有两个外键字段而不是多对多关系的模型。...写入动作函数 首先,我们需要定义一个函数,当在Admin 界面上触发该Action 的时候调用。

24.4K80
  • django 1.8 官方文档翻译: 2-5-6 多数据库

    如果某个方法缺失,在做相应的检查时Django 将忽略该路由。 Hints Hint 由数据库路由接收,用于决定哪个数据库应该接收一个给定的请求。...如果一个对象没有主键,Django 将把它当做一个新的对象,这将避免second数据库上数据的丢失: >>> p = Person(name='Fred') >>> p.save(using='first...选择一个数据库用于删除表单 默认情况下,删除一个已存在对象的调用将在与获取对象时使用的相同数据库上执行: >>> u = User.objects.using('legacy_users').get(username...为了保持两个对象之间的关联,Django 需要知道关联对象的主键是合法的。如果主键存储在另外一个数据库上,判断一个主键的合法性不是很容易。...如果你正在使用Postgres、Oracle或者MySQ 的InnoDB,这是数据库完整性级别的强制要求 —— 数据库级别的主键约束防止创建不能验证合法性的关联。

    1.5K20

    基于 Django 信号机制实现类似触发器的效果

    触发器 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作...触发器经常用于加强数据的完整性约束和业务规则等。...触发器的优点 触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。...触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。...下面我们就通过创建一个基于 Django 的学生信息管理系统来通过信号机制实现类似触发器的效果。

    2.6K30

    Django之ORM数据库

    ,而上面的sqlite数据库下的db.sqlite3则是项目自动创建 USER和PASSWORD分别是数据库的用户名和密码。...注意: 第二种方式修改不能用get的原因是:update是QuerySet对象的方法,get返回的是一个model对象,它没有update方法,而filter返回的是一个QuerySet对象(filter...在“插入和更新数据”小节中,我们有提到模型的save()方法,这个方法会更新一行里的所有列。 而某些情况下,我们只需要更新行里的某几列。...为了避免这个,可以用exists()方法来检查是否有数据: obj = Book.objects.filter(id=4) # exists()的检查可以避免数据放入...ret1.publisher是一个对象,而不是一个queryset集合 # 反向查找 ret2=models.Publish.objects.last() print(ret2

    2.6K10

    Django-官网查询部分翻译(1.11版本文档)-QuerySet-字段查找-06

    、更新、删除对象,下文将介绍如何使用这些API(以一个网页应用为例展开) 首先是创建表模型类 先分析一下他们的表关系,会有助于理解下面的内容 from django.db import models....save() 方法( .save() 没有返回值) 保存修改的表对象 想要保存一个已经改动过的对象,调用 .save() 方法即可(更新一条记录) 下面是一个 Blog 表模型类的实例化对象...." --> Manager 不能通过 Blog 实例来访问 注意: Managers 只能通过表模型类来访问,而不是模型类的实例(对象) 请你一定要分清楚你当前使用的是 表层面 的操作还是 记录层面...等 pikle 序列化时 触发了 __repr__() 或者 __str__() 时 触发了 __len__() 或者 len() 时 如果你想获取满足条件的数据条数而不需要其他信息,可以使用 .count...下面这些 QuerySet 方法会直接触发数据库操作然后返回一些其他东西,而不是 QuerySet 这些方法不会使用 cache 缓存,相反,每次调用他们都会执行数据库操作 # 常见的几个 .

    2.9K20

    第15篇-使用Django进行ElasticSearch的简单方法

    前一段时间,我在Django项目上工作,想实现快速的自由文本搜索。我决定使用NoSQL数据库,而不是使用常规数据库来执行此搜索功能(例如MySQL或PostgreSQL)。...那就是我发现ElasticSearch的时候。 ElasticSearch为您的数据索引文档,而不是像常规关系数据库那样使用数据表。这样可以加快搜索速度,并提供其他常规数据库无法获得的其他好处。...要检查其启动和运行是否正确,请打开一个新的终端窗口并运行以下 curl 命令: curl -XGET http:// localhost:9200 响应应该是这样的: { “ name”:“ 6xIrzqq...然后,您将生成器传递给常规数据库中 actions= 所有 BlogPost 对象并对其进行迭代,并 .indexing() 在每个对象上调用方法。为什么要使用发电机?...索引新保存的实例 接下来,您需要添加一个信号,以 .indexing() 在用户每次保存新博客帖子时保存的每个新实例上触发。

    5.3K00

    Django-guardian实现对象级别的权限控制

    异常,而不是返回一个空的django.http.HttpResponseForbidden GUARDIAN_RENDER_403和GUARDIAN_RAISE_403不能同时设置为True。...,将会尝试渲染403响应,而不是返回空的django.http.HttpResponseForbidden。...这可能导致guardian每次migrate之后尝试创建匿名用户的问题。将使用此设置指向的功能来获取要创建的对象。一旦获取,save方法将在该实例上被调用。...app的名字(不知道什么) ObjectPermissionChecker guardian.core.ObjectPermissionChecker用于检查特定对象的用户/组的权限。...django-guardian随附两个装饰器,这可能有助于简单的对象权限检查,但请记住,在装饰视图被调用之前,这些装饰器会触发数据库——这意味着如果在视图中进行类似的查找,那么最可能的一个(或更多,取决于查找

    3.4K30

    一个数据库事务 Bug 引发的惨剧

    return payout 这个函数的简化版本可以创建一个付款流程的新实例并返回它。在现实应用中,这个函数会验证输入并创建几个相关的对象。...为了确保所有相关对象都能和付款流程实例一同创建,我们使用了一个数据库事务。 新创建的这个实例现在代表系统中的一个付款流程,其中付款模块负责完成付款操作。...当信号接收器被触发时,它会首先检查这是否属于它自己的付款操作。如果答案是肯定的,接收器会获取相关对象(在这里就是给商家的一笔付款),并向用户发送通知。...触发一个异步任务而不是发送信号 这会遇到与信号相同的问题。批量流程失败时任务已被触发,消息将被发送出去。...4对 Django 信号的思考 就像这个故事里提到的,Django 信号可用于实现模块之间的交互,而无需在它们之间创建显式依赖项。

    95120

    django 1.8 官方文档翻译: 1-2-2 编写你的第一个Django应用,第2部分

    通常情况下,你每次修改过一个文件后开发 服务器都会自动载入,但是创建一个新文件却不会触发自动载入的逻辑。...修改正确后再重启载入页面 来检查值是否正确。 分别点击 “Today” 和 “Now” 快捷方式来修改 “Date published” 的值。...使用了 TabularInline 后(而不是 StackedInline) ,基于表的格式下相关 对象被显示的更紧凑了: 需要注意的是有个额外的 “Delete?”...我们的 poll 应用不是很复杂并不需要自定义管理模板。但是如果它变得更复杂 而且为了一些功能需要修改 Django 的标准管理模板,修改应用模板将是更 明智的选择,而不是修改项目模板。...这个变量包含了每一个 已安装的 Django 应用。你可以通过你认为最好的方法硬编码链接到特定对象的管理页面,而不是使用默认模板。

    2.5K40

    Django 1.10中文文档-第一个应用Part2-模型和管理站点

    对于极简主义者来说:INSTALLED_APPS包含的默认应用用于常见的场景,但并不是每个人都需要它们。...如果你有兴趣,你也可以运行python manage.py check;这将检查您的项目中的任何问题,而不进行迁移或触摸数据库。...使用如下命令来调用Python shell: python manage.py shell 我们使用上述命令而不是简单地键入“python”进入python环境,是因为manage.py 设置了DJANGO_SETTINGS_MODULE...Django解决了为网站管理员创建统一界面以编辑内容的问题。管理网站不打算供网站访问者使用。 创建管理用户 首先,我们需要创建一个可以登录到管理网站的用户。...它就是我们先前创建的一个question,并且通过str方法的帮助,显示了较为直观的信息,而不是一个冷冰冰的对象类型名称。 ? 点击What’s up?进入编辑界面: ?

    2.3K60

    三、模型(一)

    Admin中该字段的提示信息 choices Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作 如:...Django Admin中的错误信息会优先根据Admiin内部的ModelForm错误信息提示,如果都成功,才来检查Model的字段并显示指定错误信息 b....当你使用Django modle API创建对象时Django并未将对象保存至数据库内,除非你调用`` save()`` 方法。...当你在Python中处理Unicode对象的时候,你可以直接将它们混合使用和互相匹配而不必去考虑编码细节。 Django 在其内部的各个方面都使用到了 Unicode 对象。...更改某一指定的列,我们可以调用结果集(QuerySet)对象的update()方法: 示例如下: >>> Publisher.objects.filter(id=52).update(name='Apress

    4.5K90

    Django 3.1 官网学习路线

    用 Django 编写的每个应用程序都由一个遵循特定约定的 Python 包组成。Django 附带一个工具,它可以自动生成应用程序的基本目录结构,因此您可以专注于编写代码,而不是创建目录。...有了它,Django 可以: 为这个应用程序创建一个数据库模式(创建表语句)。 创建用于访问问题和选择对象的 Python 数据库访问 API。...迁移功能非常强大,它允许您在开发项目时随着时间的推移更改模型,而不需要删除数据库或表并创建新表——它专门用于实时升级数据库,而不会丢失数据。...使用timezone.now () #而不是date .date .now(),它将做正确的事情 In [3]: from django.utils import timezone In [4]: q...如果“Date published”的值与教程 1 中创建问题时的时间不匹配,这可能意味着您忘记为 TIME_ZONE 设置正确的值。更改它,重新加载页面并检查正确的值出现。

    8.2K10

    web开发框架之Django基础

    执行 tree,结果显示如下的目录结构 admin.py 文件跟网站的后台管理站点配置相关 apps.py 文件用于配置当前子应用的相关信息...文件用于开发测试用例,编写单元测试 views.py 文件用于编写Web应用视图 创建完子应用时需要进行三个步骤:...Django中定义路由时,通常以斜线/结尾,其好处是用户访问不以斜线/结尾的相同路径时, Django会把用户重定向到以斜线/结尾的路径上...当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表): all():返回所有数据。...注意:一旦为模型类指明自定义的过滤器后,Django不再生成默认管理对象objects。 自定义管理器类主要用于两种情况: 1.

    6.1K10

    django 1.8 官方文档翻译:13-1-2 使用Django认证系统

    User对象 User对象是认证系统的核心。它们通常表示与你的站点进行交互的用户,并用于启用限制访问、注册用户信息和关联内容给创建者等。...在Django的认证框架中只存在一种类型的用户,因此诸如'superusers'或管理员'staff'用户只是具有特殊属性集的user对象,而不是不同类型的user对象。...(username='john') >>> u.set_password('new password') >>> u.save() 如果你安装了Django admin,你还可以在认证系统的admin页面修改...权限的缓存 ModelBackend在第一次需要访问User对象来检查权限时会缓存它们的权限。这对于请求-响应循环还是比较好的,因为在权限添加进来之后并不会立即检查(例如在admin中)。...注意,user_passes_test() 不会自动检查 User 是否是不是匿名对象。

    4.7K20

    如何使用Django构建现代Web应用程序来管理客户信息并在Ubuntu 18.04上进行反应

    您将使用React作为UI库,而不是构建使用内置模板引擎的Django应用程序,利用其虚拟文档对象模型(DOM),声明性方法和快速呈现数据更改的组件。...模型定义应用程序数据的字段和行为,而视图使我们的应用程序能够正确处理Web请求并返回所需的响应。...Paginator是一个内置的Django类,它将数据列表分页到页面中,并提供访问每个页面的项目的方法。 如果是POST请求,则该方法序列化接收的客户数据,然后调用save()序列化程序对象的方法。...request.method字段中的检查验证请求方法,并根据其值调用正确的逻辑: 如果是GET请求,则客户数据将被序列化并使用Response对象发送。...如果是PUT请求,则该方法为新客户数据创建序列化程序。接下来,它调用save()创建的序列化程序对象的方法。最后,它发送一个带有更新客户的Response对象。

    14K83
    领券