断言错误:需要一个“日期”,但得到一个“日期时间”。拒绝强制,因为这可能意味着丢失时区信息

Ano*_*oop 2 django django-rest-framework

我在创建 API 时遇到了一些问题

这是我的模型

class Education(AuditFields):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    school = models.CharField(max_length=255, blank=True)
    field_of_study = models.CharField(max_length=255, blank=True)
    start_year = models.DateField(default=datetime.now)
    end_year = models.DateField(default=datetime.now)
Run Code Online (Sandbox Code Playgroud)

这是我的序列化程序:

class EducationSerializer(ModelSerializer):
    class Meta:
        model = Education
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

意见:

class EducationCreateView(CreateAPIView):
    def get_queryset(self, *args, **kwargs):
        queryset_list = Education.objects.filter(
            user=self.request.user)

        return queryset_list
    serializer_class = EducationSerializer

    def perform_create(self, serializer):
        serializer.save(user=self.request.user)
Run Code Online (Sandbox Code Playgroud)

如果我发布了一些东西,它会显示以下消息

{
    "user": [
        "This field is required."
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果我像这样改变我的序列化程序

class EducationSerializer(ModelSerializer):
    class Meta:
        model = Education
        fields = '__all__'
        extra_kwargs = {'user': {'required': False}}
Run Code Online (Sandbox Code Playgroud)

我收到这样的错误

期待一个date,但得到了一个datetime。拒绝强制,因为这可能意味着丢失时区信息。使用自定义只读字段并明确处理时区问题。

如何解决这个问题。

Cha*_*nel 7

您可以尝试为序列化器显式定义字段:

class EducationSerializer(ModelSerializer):

    start_year = serializers.DateTimeField(format="%Y-%m-%d")
    end_year = serializers.DateTimeField(format="%Y-%m-%d")
    ...
Run Code Online (Sandbox Code Playgroud)


小智 5

错误是因为模型中的两个字段:start_yearend_year

您已将它们定义为date类型,但分配了一个datetime默认值。

尝试按照给定的方式修改模型中的两个字段并导入日期时间:

import datetime

    start_year = models.DateField(default=datetime.date.today)
    end_year = models.DateField(default=datetime.date.today)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助