Метод модели 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.

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