django view.py error 'QuerySet' object has no attribute 'save' 解决方法

当尝试对Django的QuerySet对象调用'save'方法时遇到错误。解决方案是使用'update()'方法来批量更新对象,而非'save()'。'update()'直接操作数据库,不触发模型的预/后保存信号,适用于批量设置非关联字段或外键。若需逐个对象保存,需遍历QuerySet并调用'save()'。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

stackoverfolow给出的解决方法都是看手册

下面附上手册相关部分及我的翻译。
解决办法就是其中提到的这句话:

如果你想要保存一个QuerySet的每一小项并确保每个实例都运行save()命令,你不需要任何特别的函数。你需要的是直接对其运行循环语句并且发出save()命令。
for item in my_queryset:
    item.save()
################
附:手册翻译
################

马上升级多个objects

有时候你想要为一个QuerySet里的所有objects设置一个特定值空间。你可以用update()方法。例如:

# Update all the headlines with pub_date in 2007.
Entry.objects.filter(pub_date__year=2007).update(headline='Everything is the same')

用这个方法,你只能设置非关联空间和ForeignKey空间。升级非关联空间,请提供一个新取值作为恒值。升级ForeignKey空间,请设置一个新值升级你关注的新model。

>>> b = Blog.objects.get(pk=1)

# Change every Entry so that it belongs to this Blog.
>>> Entry.objects.all().update(blog=b)

update()一旦使用立即生效并返回query对应的行的数字(这些数字可能并不等于那些已经拥有新值的行的数字)。被升级的QuerySet仅有的局限是它只能访问一个数据库表格——model对应的主表。你可以在相关联控件的基础上筛选,但是你只能升级这个model的主表列。例如:

>>> b = Blog.objects.get(pk=1)

# Update all the headlines belonging to this Blog.
>>> Entry.objects.select_related().filter(blog=b).update(headline='Everything is the same')

注意,upadate()是直接被翻译成SQL命令的。它是一系列用于直接升级的操作命令集。它并不对你的model运行save()命令,也不发出pre_save或post_save信号(这些信号是由save()命令发出的),也不会照顾到auto_now空间选项。如果你想要保存一个QuerySet的每一小项并确保每个实例都运行save()命令,你不需要任何特别的函数。你需要的是直接对其运行循环语句并且发出save()命令。

for item in my_queryset:
    item.save()

Calls to update can also use F expressions to update one field based on the value of another field in the model. This is especially useful for incrementing counters based upon their current value. For example, to increment the pingback count for every entry in the blog:

>>> Entry.objects.all().update(n_pingbacks=F('n_pingbacks') + 1)

However, unlike F() objects in filter and exclude clauses, you can’t introduce joins when you use F() objects in an update – you can only reference fields local to the model being updated. If you attempt to introduce a join with an F() object, a FieldError will be raised:

# THIS WILL RAISE A FieldError
>>> Entry.objects.update(headline=F('blog__name'))
### 解决 Django 中 `AttributeError` 错误的方法 当遇到类似于 `module 'django.db.models' has no attribute 'UserInfo'` 的错误时,这通常意味着尝试访问模块中不存在的对象或方法。此类问题可能由多种原因引起。 对于特定于 `django.db.models` 模块找不到名为 `UserInfo` 属性的情况,可以考虑以下几个方面来排查并解决问题: #### 1. 导入路径不正确 如果意图使用自定义模型类 `UserInfo`,应确保该类已正确定义,并且通过正确的导入语句引入到当前文件环境中[^1]。 ```python from myapp.models import UserInfo # 假设 UserInfo 定义在 myapp 应用下的 models.py 文件内 ``` #### 2. 检查拼写错误 确认代码中的所有引用都与实际存在的对象名称完全匹配,注意大小写的准确性以及是否有额外字符被意外添加[^2]。 #### 3. 验证应用注册状态 确保包含 `UserInfo` 类的应用程序已经成功安装到了项目的设置文件 (`settings.py`) 中的 `INSTALLED_APPS` 列表里[^3]。 ```python # settings.py INSTALLED_APPS = [ ... 'myapp', # 替换为实际应用程序的名字 ... ] ``` #### 4. 数据库同步情况 有时候即使一切看起来正常,在数据库迁移未完成之前也可能引发类似的异常提示。因此建议运行如下命令以更新项目结构至最新版本[^4]: ```bash python manage.py makemigrations python manage.py migrate ``` 以上措施有助于解决因上述因素引起的 `AttributeError` 报错现象。值得注意的是,具体解决方案还需依据实际情况灵活调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值