Как использовать to_internal_field и to_representation для изменения только одного поля модели?

У меня есть модель Position, в которой есть поле с именем time_to_fill. Я хочу, чтобы пользователь мог ввести целое число, представляющее количество дней от даты создания экземпляра модели, а сериализатор преобразовал его в дату. Аналогично, при получении данных я хочу, чтобы сериализатор просто вычислял временную дельту и возвращал целое число. Я пытался реализовать это через to_internal_field(), но кажется, что мне нужно реализовать преобразование в собственные типы и обратно для всех полей. Есть ли способ использовать to_internal_field() для одного поля?

Модель:

  class Position(models.Model):
    name = models.CharField(max_length=50, blank=False)
    client = models.ForeignKey(Client, null=False, blank=False, on_delete=models.CASCADE)
    time_to_fill = models.DateTimeField(null=True, blank=True, default=timezone.now)
    applicant_source = models.JSONField(default=dict, null=True, blank=True)
    vacancies = models.IntegerField( null=True, blank=True, validators =[MinValueValidator(0)], default=0)
    filled = models.IntegerField( null=True, blank=True, validators =[MinValueValidator(0)], default=0)

Сериализатор (сбой с ошибкой ограничения NOT NULL):

class PositionSerializer(serializers.ModelSerializer):
    client_name = serializers.ReadOnlyField(source='client.name')

    class Meta:
        model = Position
        fields = '__all__'
        
    def to_internal_value(self, data):
        if (data['time_to_fill']):
            date = datetime.now(tz=timezone.utc)
            data['time_to_fill'] = date + timedelta(int(data['time_to_fill']))
        return super().to_internal_value(data)

Вернуться на верх