Skip to content

Conversation

@nkiryanov
Copy link
Contributor

Мигрируем на model-bakery + faker
API у model-bakery похож на mixer.
Чаще будет просто работать mixer.blend(...) --> baker.make(...)

Issue:

Бонус:
model-bakery будет падать, если в baker.make передавать параметр, которого нет у django модели + он не служебный. Это удобно, когда

  • меняется набор полей у модели и нужно обновить данные в тестах
  • когда ошибся в написании (somethiing вместо something) и не понятно что же тест падает.

Пример:
mixer игнорировал игнорировал атрибуты, которых нет у модели

> mixer.blend("users.User", not_existed_field="some")
> OK

model_bakery будет выкидвать exception

> self.mixer.blend("users.User", not_existed_field="some")
> Exception
> user.User doesn't have `not_existed_field` field

@nkiryanov nkiryanov requested a review from kazqvaizer October 6, 2025 08:55
Comment on lines -11 to -20
def _random_user_name() -> str:
return str(uuid.uuid4())


def _random_email() -> str:
uuid_as_str = str(uuid.uuid4()).replace("-", "_")
return f"{uuid_as_str}@mail.com"


mixer.register("users.User", username=_random_user_name, email=_random_email)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kazqvaizer fyi: у model-bakery нет 100% аналога/
Есть отдаленно напоминающие recepies (документация), но вынуждает создавать странные baker_recipes.py и потом ещё вручную их использовать.

Вообще не вижу необходимости в этом коде в шаблоне, но если решим что нужен, то думаю ок (и даже понятнее, т.к. меньше магии) убрать в users → factory → user


class FactoryProtocol(Protocol):
mixer: mixer
baker: ModuleType
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вот тут не оч идеально получается: model-bakery типизированный, но экспортирует функции с разными типами. Когда импортирую (и пишу тип) для модуля, то langauge сервер не подскажет типы у функций

  1. То есть в моём варианте нет подсветки синтаксиса
@register
def user(self: FactoryProtocol, **kwargs) -> User:
    return self.baker.make("users.User", **kwargs)  #  <-- нет подсветки/проверки синтаксиса
  1. А если импортировать baker в каждом файле, то будет понятно что за модуль baker и будет проверка синтаксиса
from model_bakery import baker   # <-- импортируем напрямую

@register
def user(self: FactoryProtocol, **kwargs) -> User:
    return baker.make("users.User", **kwargs)  #  <-- есть проверка синтаксиса

То вариант 2 мне совсем не нравится — в каждом файле с тестами придётся испортировать, не удобно + сложнее заменить на что-то другое как сейчас меняем mixer.

@nkiryanov nkiryanov force-pushed the migrate-to-model-bakery branch from 6ca77bb to 00f5b75 Compare October 6, 2025 18:40
@kazqvaizer
Copy link
Contributor

Мне норм, все лучше чем древний миксер! Мерджим?

@nkiryanov nkiryanov merged commit e613ae8 into master Oct 7, 2025
3 checks passed
@nkiryanov nkiryanov deleted the migrate-to-model-bakery branch October 7, 2025 06:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants