Метод модели Django, использующий данные из модели
Я хочу генерировать уникальные коды (например, "DXGH") и сохранять их как поле в одной из моих моделей. Проблема заключается в том, что я не знаю, как проверять ранее сгенерированные коды при создании нового объекта.
В настоящее время мой models.py выглядит примерно так:
def code_gen():
random_string = ''
for _ in range(4):
random_string += chr(random.randint(97,122))
return random_string
class Room(models.Model):
room_code = models.CharField(default=code_gen)
#other fields
def __str__(self):
return self.room_code
#other methods
def code_gen_unique(self):
#I know the code below is incorrect
code_list = []
for object in Room.Objects.all():
code_list.append(object.room_code)
while True:
temp_code = code_gen()
if temp_code in code_list:
continue
break
return temp_code
Идеально я бы установил значение по умолчанию room_code в code_gen_unique, но я не могу объявить code_gen_unique() ни до класса Room, ни после него.
Я ожидаю, что существует гораздо более простое решение, чем то, которое я рассматривал, и буду очень признателен за любую помощь! Будьте здоровы
Редактировать
Спасибо Willem Van Onsem за исправление моего понимания - объявление функции проверки уникальности перед Моделью и установка функции в качестве значения по умолчанию для поля room_code делает свое дело.
Вы можете определить генератор по умолчанию до определения Room класса:
def code_gen():
random_string = ''
for _ in range(4):
random_string += chr(random.randint(97,122))
return random_string
def code_gen_unique():
code_set = set(Room.Objects.values('room_code'))
while True:
temp_code = code_gen()
if temp_code not in code_set:
return temp_code
class Room(models.Model):
room_code = models.CharField(default=code_gen)
# …
Идентификатор Room будет разрешен в класс Room, поскольку метод будет выполняться не при определении, а при вызове, и вызываться он будет только при конструировании нового объекта Room.