Использование get_model в пользовательском генераторе slug вызывает ошибку django.core.exceptions.AppRegistryNotReady: Модели еще не загружены
Я создал пользовательскую функцию генератора slug для использования в нескольких моделях в нескольких приложениях. Для этого я передаю в функцию имя соответствующего приложения django и модель django в качестве строковых параметров, чтобы функция могла проверить, является ли slug уникальным для данной модели:
def slug_generator(django_app, django_model, field_name, slug_len, prefix=""):
unique_pk = False
model = apps.get_model(django_app, django_model)
while not unique_pk:
random_pks = random.sample(
string.ascii_uppercase + string.digits + string.ascii_lowercase, slug_len)
new_pk = ''.join(random_pks)
search_query = {field_name: new_pk}
try:
if not model.objects.filter(**search_query).exists():
unique_pk = True
except:
if not model.objects.all().exists():
unique_pk = True
return prefix + new_pk
вызывается в models.py следующим образом:
class Form(models.Model):
form_id = models.CharField(
max_length=25, default=slug_generator('forms', 'Form', 'form_id', 25))
Функция работала нормально, когда я использовал ее только для одной модели (поэтому я не использовал get_model, я просто жестко закодировал модель, для которой она предназначалась). После добавления get_model при запуске возникает ошибка django.core.exceptions.AppRegistryNotReady: Models are not loaded yet.
Я попробовал поместить следующее перед моей функцией:
import django
django.setup()
Это привело меня только к новой ошибке RuntimeError: populate() isn't reentrant, так что это заставляет меня думать, что есть лучший способ написать функцию. Возможно ли то, чего я пытаюсь достичь, или мне следует просто рефакторить часть генерации строк из функции и сделать функцию slug_generator для каждой модели с жестко закодированными именами моделей?
Понял, что это потому, что я вызываю функцию в поле формы, предоставляя ей параметры. Я изменил их на следующие и добился запуска:
def get_slug():
return slug_generator('forms', 'Form', 'form_id', 25)
class Form(models.Model):
form_id = models.CharField(
max_length=25, default=get_slug)
не уверен, есть ли более элегантный способ сделать это