Django中如何重写save方法让新增Post的Order字段自动加1?
问题原因说明
你原来的实现有几个关键错误:
- 大小写匹配错误:你定义的字段是大写
Order,代码里用了小写order,Python对属性名大小写敏感 - 查询集调用错误:
self.order.objects.all()写法完全错误,模型管理器应该从Post模型类调用,不能从实例字段调用 - 赋值对象错误:你把自增后的值赋给了查询到的最后一条实例,没有赋值给当前要保存的新实例
- 缺少新增判断:没有区分是新增实例还是更新现有实例,更新操作时不应该修改
Order值 - 缺少边界处理:没有考虑表中还没有任何Post的情况,首次创建会找不到
latest报错
正确实现代码
直接把重写的save方法放到你的Post模型里即可:
from django.db.models import Max class Post(models.Model): title = models.CharField(max_length=15) create = models.DateTimeField(auto_now_add=True) Order = models.PositiveIntegerField() def save(self, *args, **kwargs): # 仅新增实例(未生成主键id)时自动设置Order值 if not self.id: # 聚合查询现有数据的最大Order值,无数据时默认返回0 max_order = Post.objects.aggregate(max_order=Max('Order'))['max_order'] or 0 self.Order = max_order + 1 super().save(*args, **kwargs)
补充说明
如果你的站点有高并发新增Post的场景,建议给这段逻辑加数据库事务锁,避免出现Order值重复的问题,常规访问量级下上述代码已经可以正常运行。
内容的提问来源于stack exchange,提问作者Elliot13
相关产品推荐
相关产品推荐

