Как вернуться к модели из utils.py в объекте Django

Я пытаюсь создать поле в модели django, которое задает уникальное значение в модели. Я использую utils.py для генерации значения.

Я получаю следующую ошибку:

File "/Users/evancutler/PycharmProjects/DjangoProject1/MCARS/utils.py", line 2, in <module>
    from MCARS.models import Profile
ImportError: cannot import name 'Profile' from partially initialized module 'MCARS.models' (most likely due to a circular import) (/Users/evancutler/PycharmProjects/DjangoProject1/MCARS/models.py)

Вот моя модель:

class Profile(models.Model):

    # Managed fields
    user     = models.OneToOneField(User, related_name="profile", on_delete=models.CASCADE)
    memberid = models.CharField(
            max_length = 10,
            blank=True,
            editable=True,
            unique=True,
            default=utils.create_new_ref_number()
        )
    avatar   = models.ImageField(upload_to="static/mcars/img/avatars", null=True, blank=True)
    birthday = models.DateField(null=True, blank=True)
    gender   = models.CharField(max_length=10, choices=constants.GENDER_CHOICES, null=True, blank=True)
    invited  = models.BooleanField(default=False)
    registered = models.BooleanField(default=False)
    height   = models.PositiveSmallIntegerField(null=True, blank=True)
    phone    = models.CharField(max_length=32, null=True, blank=True)
    address  = models.CharField(max_length=255, null=True, blank=True)
    number   = models.CharField(max_length=32, null=True, blank=True)
    city     = models.CharField(max_length=50, null=True, blank=True)
    zip      = models.CharField(max_length=30, null=True, blank=True)

вот мои утилиты:

import random
from MCARS.models import Profile

def create_new_ref_number():
    not_unique = True
    while not_unique:
        unique_ref = random.randint(1000000000, 9999999999)
        if not Profile.objects.filter(memberid=unique_ref):
            not_unique = False
    return str(unique_ref)

как мне сообщить утилитам.py, чтобы они обратились к модели, чтобы проверить, является ли значение уникальным, и если нет, повторить попытку?

Спасибо!

ПРИМЕЧАНИЕ: Прежде всего, генерация случайных идентификаторов, подобных этому, является крайне неэффективным способом. Позже, по мере роста числа участников, вы столкнетесь с множеством проблем. Django автоматически присваивает уникальный идентификатор каждому объекту модели. Вы должны использовать это.

<время работы/>

Теперь, чтобы ответить на ваш вопрос: вы столкнулись с проблемой циклического импорта.

Решение состоит в том, чтобы сохранить функцию create_new_ref_number в том же файле, что и ваша модель.

Еще одна проблема, которую я заметил, заключается в том, что вы вызываете функцию при передаче ее в качестве аргумента по умолчанию. Правильный способ - передать имя функции без круглых скобок (т.е. create_new_ref_number без ()), и Django вызовет ее при необходимости.

Пример:

# models.py
class Profile(...):
    memberid = models.CharField(
            ...
            default=create_new_ref_number # IMPORTANT: no parentheses i.e. no ()
        )

# function stays in the same file as the model
def create_new_ref_number(...):
    ...
Вернуться на верх