Использование 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)

не уверен, есть ли более элегантный способ сделать это

Вернуться на верх