---
url: "https://vueda.dev/v3/reference/api/py/vueda.user.serializers/TOTPDeviceSerializer.md"
title: "TOTPDeviceSerializer"
---

# TOTPDeviceSerializer

## Overview

A `ModelSerializer` is just a regular `Serializer`, except that:

* A set of default fields are automatically populated.
* A set of default validators are automatically populated.
* Default `.create()` and `.update()` implementations are provided.

The process of automatically determining a set of serializer fields
based on the model fields is reasonably complex, but you almost certainly
don't need to dig into the implementation.

If the `ModelSerializer` class *doesn't* generate the set of fields that
you need you should either declare the extra/differing fields explicitly on
the serializer class, or simply use a `Serializer` class.

## `Meta` {#Meta}

### Source {#Meta-source}

`server/vueda/user/serializers.py:293`

## `get_created_at` {#get_created_at}

### Signature {#get_created_at-signature}

`get_created_at(self, obj)`

#### Parameters {#get_created_at-parameters}

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| self |  | yes |  |  |
| <span id="get_created_at-param-obj">obj</span> |  | yes |  |  |

### Source {#get_created_at-source}

`server/vueda/user/serializers.py:307`

## `get_last_used_at` {#get_last_used_at}

### Signature {#get_last_used_at-signature}

`get_last_used_at(self, obj)`

#### Parameters {#get_last_used_at-parameters}

| Name | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| self |  | yes |  |  |
| <span id="get_last_used_at-param-obj">obj</span> |  | yes |  |  |

### Source {#get_last_used_at-source}

`server/vueda/user/serializers.py:310`

## `created_at` {#created_at}

## `formatted_name` {#formatted_name}

## `last_used_at` {#last_used_at}

## `method` {#method}

## Source

`server/vueda/user/serializers.py:285`
