Как вернуться к модели из 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(...):
...