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

Django REST Framework POST返回datetimefield正常GET为空如何解决

问题根因
  • 核心问题出在FirstSerializer的datetimefield字段使用了SerializerMethodField:该字段是只读序列化字段,仅会在返回响应时动态生成值,不会将值写入数据库。你POST请求返回的时间是接口临时生成的,实际并未存储到SomeModel对应记录的datetimefield字段中,因此GET请求读取数据库存储值时返回空。
  • 存在多处代码拼写错误:
    1. ViewSet的get_serializer_class方法中else分支返回的是不存在的SecondAppSerializer,你实际定义的序列化器名为SecondSerializer
    2. SecondSerializer的Meta配置中model字段填的是不存在的SomeObject,关联的模型应该是SomeModel
    3. 所有序列化器的fields配置是单元素字符串,而非元组:单元素元组需要加末尾逗号,否则会被Django识别为字符串引发后续异常
解决方案
  1. 替换FirstSerializer中的SerializerMethodField,改为可写入的普通字段,配置默认值为当前时间,保证POST请求时时间值会写入数据库
  2. 修正所有拼写错误
  3. 调整fields配置为合法元组格式
  4. (可选优化)模型的datetimefield建议改为DateTimeField类型,更符合字段属性,无需手动处理字符串格式
修改后代码示例
from django.utils import timezone
from rest_framework import viewsets, serializers
from .models import SomeModel

class SomeViewSet(viewsets.ModelViewSet):
    queryset = SomeModel.objects.all()

    def get_serializer_class(self):
        if self.request.method == 'POST':
            return FirstSerializer
        else:
            # 修正序列化器名称拼写错误
            return SecondSerializer

class FirstSerializer(serializers.HyperlinkedModelSerializer):
    # 替换SerializerMethodField为可写字段,设置默认值为当前时间
    datetimefield = serializers.CharField(default=lambda: str(timezone.now()))

    class Meta:
        model = SomeModel
        # 单元素元组加末尾逗号
        fields = ('datetimefield',)

class SecondSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        # 修正关联模型拼写错误
        model = SomeModel
        fields = ('datetimefield',)

class SomeModel(models.Model):
    datetimefield  = models.CharField(max_length=100)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:15:02