Django REST Framework POST返回datetimefield正常GET为空如何解决
问题根因
- 核心问题出在
FirstSerializer的datetimefield字段使用了SerializerMethodField:该字段是只读序列化字段,仅会在返回响应时动态生成值,不会将值写入数据库。你POST请求返回的时间是接口临时生成的,实际并未存储到SomeModel对应记录的datetimefield字段中,因此GET请求读取数据库存储值时返回空。 - 存在多处代码拼写错误:
- ViewSet的
get_serializer_class方法中else分支返回的是不存在的SecondAppSerializer,你实际定义的序列化器名为SecondSerializer SecondSerializer的Meta配置中model字段填的是不存在的SomeObject,关联的模型应该是SomeModel- 所有序列化器的
fields配置是单元素字符串,而非元组:单元素元组需要加末尾逗号,否则会被Django识别为字符串引发后续异常
- ViewSet的
解决方案
- 替换
FirstSerializer中的SerializerMethodField,改为可写入的普通字段,配置默认值为当前时间,保证POST请求时时间值会写入数据库 - 修正所有拼写错误
- 调整fields配置为合法元组格式
- (可选优化)模型的
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
相关产品推荐
相关产品推荐

