def get_changed_since(
self,
model_label: str,
timestamp: int,
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_last_modified__gt=timestamp) |
Q(
sync_field_last_modified=timestamp,
**identity_gt,
),
)
else:
queryset = model.objects.filter(
sync_field_last_modified__gt=timestamp,
)
queryset = queryset.order_by(
'sync_field_last_modified',
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
}