You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

额外优化建议

  1. 简化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
  1. 数据库层面约束:给user字段加上unique=True,确保同一个user在数据库里只有一条记录,从根源避免重复数据问题:
user = models.CharField(max_length=20, verbose_name="User Name", help_text="User Name", unique=True)

内容的提问来源于stack exchange,提问作者Jepsenwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:07:28