Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

+1 199новых вакансий за сутки·93 838вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 273
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: фильтры с числами, отклик по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 409 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 222
  • Облачные технологии14 171
  • QA вакансии3 456
  • Backend вакансии2 114
  • Инженер данных1 801
  • Продакт-менеджер1 247

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии997
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 593
  • Node.js2 036
  • .NET1 739
  • Kotlin1 618
  • Rust1 472
  • C#717
  • PHP690
  • C++579

DevOps и инфраструктура

  • Kubernetes7 787
  • DevOps вакансии6 095
  • Linux-инфраструктура5 508
  • Terraform / IaC4 287
  • CI/CD3 272
  • Мониторинг и Observability1 792
  • SRE566
  • Кибербезопасность454

Аналитика и данные

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных858
  • Системный аналитик154

Другие направления

  • Проджект-менеджер624
  • UI/UX дизайн149
  • Ручное тестирование14

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 867

По формату

  • Удалённые вакансии75 005
  • Релокация в США44 166
  • Гибридная работа12 485
  • Офисная работа7 090

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 960
  • Junior вакансии6 708

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PydanticВсе вопросы
PydanticMiddleКодинг

Как написать кастомные сериализаторы с помощью @model_serializer в Pydantic v2?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

@model_serializer заменяет стандартную сериализацию всей модели целиком: в режиме plain метод полностью контролирует выходной словарь, в режиме wrap — получает handler для вызова стандартной логики и может её модифицировать.

Базовый синтаксис

from pydantic import BaseModel, model_serializer

class Money(BaseModel):
    amount: int  # в копейках
    currency: str

    @model_serializer
    def serialize(self) -> dict:
        return {
            "amount": self.amount / 100,
            "currency": self.currency.upper(),
            "display": f"{self.amount / 100:.2f} {self.currency.upper()}",
        }

m = Money(amount=9999, currency="rub")
print(m.model_dump())
# {'amount': 99.99, 'currency': 'RUB', 'display': '99.99 RUB'}
print(m.model_dump_json())
# {"amount":99.99,"currency":"RUB","display":"99.99 RUB"}

Кастомные сериализаторы с @model_serializer в Pydantic v2

Декоратор @model_serializer позволяет полностью контролировать, как вся модель целиком превращается в сериализованное представление. В отличие от @field_serializer, который работает с одним полем, @model_serializer получает доступ ко всему экземпляру и возвращает итоговое значение — обычно словарь или примитив.

Параметр mode: 'plain' vs 'wrap'

mode='plain' (по умолчанию) — ваш метод полностью заменяет стандартную сериализацию. mode='wrap' — ваш метод получает вторым аргументом handler и может вызвать стандартную сериализацию, а затем модифицировать результат.

from pydantic import BaseModel, model_serializer, SerializerFunctionWrapHandler
from typing import Any

class AuditedModel(BaseModel):
    name: str
    secret: str

    @model_serializer(mode="wrap")
    def serialize(self, handler: SerializerFunctionWrapHandler) -> dict[str, Any]:
        result = handler(self)  # стандартный словарь со всеми полями
        result.pop("secret", None)  # убираем чувствительное поле
        result["_serialized"] = True
        return result

obj = AuditedModel(name="Alice", secret="s3cr3t")
print(obj.model_dump())
# {'name': 'Alice', '_serialized': True}  — secret удалён

Учёт mode сериализации (python vs json)

Если модель сериализуется через model_dump(mode='json') или model_dump_json(), вы можете узнать об этом через параметр info:

from pydantic import BaseModel, model_serializer, SerializationInfo
from datetime import datetime

class Event(BaseModel):
    name: str
    ts: datetime

    @model_serializer(mode="wrap")
    def serialize(self, handler, info: SerializationInfo) -> dict:
        result = handler(self)
        if info.mode == "json":
            result["ts"] = result["ts"]  # уже строка в json mode
        else:
            result["ts_epoch"] = self.ts.timestamp()  # добавляем epoch только для Python mode
        return result

e = Event(name="Deploy", ts=datetime(2024, 1, 15, 12, 0, 0))
print(e.model_dump())           # содержит ts_epoch
print(e.model_dump(mode="json")) # не содержит ts_epoch

return_as_any — произвольный тип возврата

По умолчанию Pydantic ожидает, что сериализатор вернёт словарь. Если нужно вернуть строку или другой примитив, используйте return_as_any=True:

from pydantic import BaseModel, model_serializer

class Tag(BaseModel):
    name: str
    color: str

    @model_serializer(return_as_any=True)
    def serialize(self) -> str:
        return f"#{self.color}:{self.name}"

tag = Tag(name="urgent", color="red")
print(tag.model_dump())  # '#red:urgent'

Подводные камни

  • @model_serializer перезаписывает ВСЁ — в режиме plain стандартная логика полностью заменяется. Если забыть вернуть поля явно, они пропадут из вывода без ошибки.
  • include/exclude не работают — model_dump(include={'name'}) игнорируется, если есть кастомный сериализатор в режиме plain; фильтрацию нужно реализовывать вручную.
  • model_dump_json() вызывает сериализатор тоже — убедитесь, что возвращаемые типы JSON-сериализуемы, иначе получите PydanticSerializationError.
  • Рекурсия во wrap-режиме — не вызывайте self.model_dump() внутри сериализатора; это вызовет бесконечную рекурсию. Используйте handler(self).
  • Совместимость с model_copy() — кастомный сериализатор не влияет на model_copy(), только на model_dump() и model_dump_json().
  • Нет доступа к context через self — контекст передаётся через info.context в параметре SerializationInfo, а не через атрибуты модели.
  • Унаследованные модели — @model_serializer на родительском классе применяется и к потомкам, что может дать неожиданный результат, если потомок добавил новые поля.

Частые вопросы на собеседовании

  • В чём разница между Pydantic v1 и Pydantic v2 — каковы основные breaking changes?
  • Что такое Pydantic и какую проблему он решает в Python-приложениях?
  • Как Pydantic использует аннотации типов Python для валидации данных?
  • Как Pydantic обрабатывает приведение типов (type coercion) — в чём разница между strict mode и lax mode?

Типичные ошибки

  • Описывать model serializers только как термин и не показывать механизм на минимальном примере.
  • Игнорировать ошибки, пустые данные, конкурентный доступ или границы транзакции.
  • Не связывать поведение с официальным контрактом Pydantic и реальной эксплуатацией.

Что проверяет интервьюер

  • Объясняет model serializers через последовательность действий, а не через набор ключевых слов.
  • Приводит короткий кодовый пример или production-сценарий с ожидаемым поведением.
  • Называет хотя бы один риск: производительность, безопасность, транзакции, память или сопровождение.

Как вы знаете этот вопрос?

Проверить себя по теме Pydantic →

Источники

  • https://docs.pydantic.dev/latest/concepts/serialization/
  • https://docs.pydantic.dev/latest/api/fields/
←Предыдущий вопросКак определить вложенные модели в Pydantic и как они валидируются?Следующий вопрос→Как определить опциональные поля и значения по умолчанию в Pydantic-модели?

Связанные темы

Pydanticimplementationpydantictechnical-reasoning