Создание новых объектов под конкретные параметры - PullRequest
1 голос
/ 10 июля 2019

Я новичок в django и пытаюсь понять возможности моделей django. Я наткнулся на менеджеров моделей и понял, что их можно использовать для выполнения индивидуальных запросов, и я понимаю, как они выполняют эту функцию.

Но что, если бы я хотел создать новый объект, но под определенным набором рекомендаций. Например, скажем, у меня была модель как таковая:

#models.py
class TestModel(model.Model):
    num = models.IntegerField(default=5)

Теперь, если я создаю новый объект без указания значения num, он установит его значение по умолчанию равным 5. Но возможно ли иметь в модели функцию создания, которая бы придала ему другое значение. Например, что, если бы я хотел, чтобы значение было случайным числом от 1 до 100. Я знаю, что я всегда мог запустить эту функцию, а затем установить поле num равным его выходу, а затем создать новый объект, но я хочу иметь это Функция запускается внутри модели и выполняется просто путем вызова TestModel (). Это возможно?

1 Ответ

1 голос
/ 10 июля 2019

Как вы знаете, существует несколько способов получения случайных целых чисел, таких как использование пакетов random, numpy и т. Д. Но есть также пакет под названием uuid, обозначающий Universally Unique IDentifier , который генерирует случайные 128-байтовые идентификаторы на основе времени, компьютерного оборудования (MAC и т. Д.).

Когда вы используете все эти методы для генерации случайных чисел в обычных программах на Python, они будут отлично работать. Но когда вы используете их в моделях Django, каждая из них дает один и тот же вывод, независимо от того, сколько времени вы запускаете.

Я обнаружил этот обходной путь,

import uuid, random

class MyModel(models.Model):

    def get_random_integer():
        id = uuid.uuid4()
        # id.int is a big number, use some logic to get number in range of 1 to 100
        random.seed(id.int)
        return random.randrange(1, 100)

    num = models.IntegerField(default=get_random_integer)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...