def get_changed_since(
self,
model_label: str,
sequence: int,
peer_node_id: str,
sequence_max: int | None = None,
limit: int | None = None,
after_key: str | None = None,
) -> dict[str, SyncRecord]:
model = self._get_model(model_label)
many_to_many_names = self._get_many_to_many_names(model)
if after_key:
identity_gt = {
f'{self._identity_field}__gt': after_key,
}
queryset = model.objects.filter(
Q(sync_field_sequence__gt=sequence) |
Q(
sync_field_sequence=sequence,
**identity_gt,
),
)
else:
queryset = model.objects.filter(
sync_field_sequence__gt=sequence,
)
if sequence_max is not None:
queryset = queryset.filter(
sync_field_sequence__lte=sequence_max,
)
if peer_node_id:
queryset = queryset.exclude(
sync_field_origin_node=peer_node_id,
)
queryset = queryset.order_by(
'sync_field_sequence',
self._identity_field,
)
if limit is not None:
queryset = queryset[:limit]
if many_to_many_names:
queryset = queryset.prefetch_related(
*many_to_many_names,
)
return {
str(getattr(instance, self._identity_field)): self._instance_to_record(instance)
for instance in queryset
}