def __init__(
self,
models: list[type[SyncableMixin]],
identity_field: str = 'id',
batch_size_max: int = _BATCH_SIZE_MAX,
delete_strategies: dict[str, DeleteStrategy] | None = None,
many_to_many_applier: ManyToManyApplier | None = None,
upsert_strategy: UpsertStrategy | None = None,
) -> None:
if not models:
message = 'models must not be empty'
raise InvalidParameterError(message)
if not identity_field:
message = 'identity_field must be a non-empty string'
raise InvalidParameterError(message)
if batch_size_max < 1:
message = (
f'batch_size_max must be >= 1, '
f'got {batch_size_max}'
)
raise InvalidParameterError(message)
self._batch_size_max = batch_size_max
self._identity_field = identity_field
self._models: dict[str, type[SyncableMixin]] = {
model._meta.label: model
for model in models
}
self._serializers: dict[str, SyncFieldSerializer] = {
model._meta.label: SyncFieldSerializer(model)
for model in models
}
self._upsert_strategy = (
upsert_strategy
or BulkUpsertStrategy(
identity_field=identity_field,
)
)
self._many_to_many_applier = (
many_to_many_applier
or ManyToManyApplier(
identity_field=identity_field,
)
)
self._delete_strategies = (
delete_strategies
or self._build_delete_strategies(models)
)