pull/11656/merge
Neeraj P Yetheendran 2025-04-24 11:33:01 +00:00 zatwierdzone przez GitHub
commit 3b0026ee09
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
3 zmienionych plików z 51 dodań i 18 usunięć

Wyświetl plik

@ -221,12 +221,16 @@ class Index:
).exclude(object_id__in=existing_pks) ).exclude(object_id__in=existing_pks)
stale_entries.delete() stale_entries.delete()
def delete_stale_entries(self): def delete_stale_entries(self, models=None):
for model in get_indexed_models(): if models:
# We dont need to delete stale entries for non-root models, for model in models:
# since we already delete them by deleting roots.
if not model._meta.parents:
self.delete_stale_model_entries(model) self.delete_stale_model_entries(model)
else:
for model in get_indexed_models():
# We dont need to delete stale entries for non-root models,
# since we already delete them by deleting roots.
if not model._meta.parents:
self.delete_stale_model_entries(model)
def add_item(self, obj): def add_item(self, obj):
self.add_items(obj._meta.model, [obj]) self.add_items(obj._meta.model, [obj])
@ -614,8 +618,8 @@ class MySQLSearchRebuilder:
def __init__(self, index): def __init__(self, index):
self.index = index self.index = index
def start(self): def start(self, models=None):
self.index.delete_stale_entries() self.index.delete_stale_entries(models)
return self.index return self.index
def finish(self): def finish(self):

Wyświetl plik

@ -232,12 +232,16 @@ class Index:
).exclude(object_id__in=existing_pks) ).exclude(object_id__in=existing_pks)
stale_entries.delete() stale_entries.delete()
def delete_stale_entries(self): def delete_stale_entries(self, models=None):
for model in get_indexed_models(): if models:
# We dont need to delete stale entries for non-root models, for model in models:
# since we already delete them by deleting roots.
if not model._meta.parents:
self.delete_stale_model_entries(model) self.delete_stale_model_entries(model)
else:
for model in get_indexed_models():
# We dont need to delete stale entries for non-root models,
# since we already delete them by deleting roots.
if not model._meta.parents:
self.delete_stale_model_entries(model)
def add_item(self, obj): def add_item(self, obj):
self.add_items(obj._meta.model, [obj]) self.add_items(obj._meta.model, [obj])
@ -662,8 +666,8 @@ class PostgresSearchRebuilder:
def __init__(self, index): def __init__(self, index):
self.index = index self.index = index
def start(self): def start(self, models=None):
self.index.delete_stale_entries() self.index.delete_stale_entries(models)
return self.index return self.index
def finish(self): def finish(self):

Wyświetl plik

@ -70,9 +70,9 @@ class Command(BaseCommand):
self.write("Backend '%s' doesn't require rebuilding" % backend_name) self.write("Backend '%s' doesn't require rebuilding" % backend_name)
return return
models_grouped_by_index = group_models_by_index( indexed_models = getattr(self, "only_models", get_indexed_models())
backend, get_indexed_models() models_grouped_by_index = group_models_by_index(backend, indexed_models).items()
).items()
if not models_grouped_by_index: if not models_grouped_by_index:
self.write(backend_name + ": No indices to rebuild") self.write(backend_name + ": No indices to rebuild")
@ -81,7 +81,11 @@ class Command(BaseCommand):
# Start rebuild # Start rebuild
rebuilder = backend.rebuilder_class(index) rebuilder = backend.rebuilder_class(index)
index = rebuilder.start()
if getattr(self, "only_models", None):
index = rebuilder.start(models)
else:
index = rebuilder.start()
# Add models # Add models
for model in models: for model in models:
@ -138,6 +142,14 @@ class Command(BaseCommand):
type=int, type=int,
help="Set number of records to be fetched at once for inserting into the index", help="Set number of records to be fetched at once for inserting into the index",
) )
parser.add_argument(
"--only",
action="store",
dest="only_models",
default=None,
type=str,
help="Only update indexes on certain models. (comma separated, '?' to get list of options)",
)
def handle(self, **options): def handle(self, **options):
self.verbosity = options["verbosity"] self.verbosity = options["verbosity"]
@ -153,6 +165,19 @@ class Command(BaseCommand):
# index the 'default' backend only # index the 'default' backend only
backend_names = ["default"] backend_names = ["default"]
if options["only_models"]:
all_models = {model._meta.label: model for model in get_indexed_models()}
if options["only_models"] == "?":
self.stdout.write(",".join(all_models.keys()))
return
self.only_models = []
for model_label in options["only_models"].split(","):
model = all_models.get(model_label, None)
if model:
self.only_models.append(model)
else:
self.stderr.write(f"{model_label} is not a valid model name")
return
# Update backends # Update backends
for backend_name in backend_names: for backend_name in backend_names:
self.update_backend( self.update_backend(