Ошибка Assertion: ожидал `date`, но получил` datetime`. Отказ от принуждения, так как это может означать потерю информации о часовом поясе - PullRequest
1 голос
/ 16 марта 2020

При создании 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)

Это мой сериализатор:

class EducationSerializer(ModelSerializer):
    class Meta:
        model = Education
        fields = '__all__'

просмотров:

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)

Если я что-то напишу, будет показано следующее сообщение

{
    "user": [
        "This field is required."
    ]
}

если я изменю свой сериализатор следующим образом

class EducationSerializer(ModelSerializer):
    class Meta:
        model = Education
        fields = '__all__'
        extra_kwargs = {'user': {'required': False}}

Я получаю ошибку, подобную этой

Ожидается date, но есть datetime. Отказ от принуждения, поскольку это может означать потерю информации о часовом поясе. Используйте настраиваемое поле только для чтения и решайте проблемы с часовыми поясами.

Как решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Ошибка из-за двух полей в модели: start_year и end_year

Вы определили их как тип date, но по умолчанию присваиваете значение datetime.

Попробуйте изменить два поля в модели, как указано, а также импортируйте дату и время:

import datetime

    start_year = models.DateField(default=datetime.date.today)
    end_year = models.DateField(default=datetime.date.today)

Надеюсь, это поможет

0 голосов
/ 16 марта 2020

Вы можете попытаться явно определить поля для сериализатора:

class EducationSerializer(ModelSerializer):

    start_year = serializers.DateTimeField(format="%Y-%m-%d")
    end_year = serializers.DateTimeField(format="%Y-%m-%d")
    ...
...