Django DRF更新同user记录后GET接口返回旧数据求助
问题分析
核心原因是Django ORM的queryset缓存机制:你在TestViewset里定义的queryset = TestModel.objects.all()是在类加载时就执行的,会缓存初始查询结果。当POST请求更新数据库后,GET请求获取单条记录时,视图依然从缓存的queryset里找数据,而不是重新从数据库拉取最新内容,所以返回旧值。
解决方案
有两种直接有效的解决方式:
方案1:动态获取queryset
把类级别的静态queryset替换成动态方法,确保每次请求都重新查询数据库:
class TestViewset(viewsets.ModelViewSet): lookup_field = 'user' permission_classes = (permissions.IsAuthenticated,) serializer_class = TestModelSerializer def get_queryset(self): # 每次请求都从数据库拉最新数据 return TestModel.objects.all()
方案2:重写获取单条对象的方法
绕过缓存的queryset,直接从数据库查询目标对象:
class TestViewset(viewsets.ModelViewSet): lookup_field = 'user' permission_classes = (permissions.IsAuthenticated,) serializer_class = TestModelSerializer queryset = TestModel.objects.all() def get_object(self): # 从URL参数里取user值 user_val = self.kwargs.get(self.lookup_field) # 直接查询数据库获取最新记录 return TestModel.objects.get(user=user_val)
额外优化建议
- 简化upsert逻辑:你序列化器里的
create方法可以用Django内置的update_or_create替代手动try-except,代码更简洁可靠:
def create(self, validated_data): user = validated_data.pop('user') testobj, _ = TestModel.objects.update_or_create( user=user, defaults=validated_data ) return testobj
- 数据库层面约束:给
user字段加上unique=True,确保同一个user在数据库里只有一条记录,从根源避免重复数据问题:
user = models.CharField(max_length=20, verbose_name="User Name", help_text="User Name", unique=True)
内容的提问来源于stack exchange,提问作者Jepsenwan
相关产品推荐
相关产品推荐

