Django中Contact模型appearance字段自增失效问题求助
问题原因与解决办法
核心问题
你的代码只在内存里修改了appearance字段的值,没把变更同步到数据库;而且每次请求都会从数据库重新读取原始数据,所以才会出现接口返回值一直是1、数据库里数值始终为0的情况。
具体修复步骤
1. 给模型方法添加数据库保存操作
修改Contact模型的get_appear方法,在自增后调用save()把修改写入数据库:
class Contact(models.Model): name = models.CharField(max_length=255) phone = models.CharField(max_length=255) appearance = models.PositiveIntegerField(default=0) def get_appear(self): self.appearance += 1 self.save() # 新增这行,将变更同步到数据库
2. (可选)用原子更新解决并发问题
如果你的接口会有高并发访问,上面的写法可能出现竞态条件(多个请求同时读取同一个值,自增后保存导致计数不准)。可以改用数据库层面的原子更新:
# 模型方法修改为如下 def get_appear(self): # 直接在数据库执行自增操作 Contact.objects.filter(id=self.id).update(appearance=models.F('appearance') + 1) # 重新从数据库加载最新值,保证返回的序列化数据是最新的 self.refresh_from_db()
这种方式跳过内存修改,直接操作数据库,避免并发冲突,同时refresh_from_db()能让当前实例拿到最新的数值。
3. 验证修复效果
修改后重启服务,再次访问http://127.0.0.1:8000/api/v1/contacts/3/,此时数据库中的appearance字段会每次自增1,接口返回的数值也会同步递增。
内容的提问来源于stack exchange,提问作者tarp20
相关产品推荐
相关产品推荐

