django - 在特定参数下创建新对象
问题描述
我是 django 的新手,并试图了解 django 模型的功能。我偶然发现了模型管理器,并了解它们可用于执行自定义查询,并且我了解它们如何提供该功能。
但是,如果我想在一组特定的指导下创建一个新对象怎么办。例如,假设我有一个这样的模型:
#models.py
class TestModel(model.Model):
num = models.IntegerField(default=5)
现在,如果我创建一个新对象而不指定 num 的值,它将设置其默认值等于 5。但是是否有可能在模型中有一个创建函数来赋予它另一个值。例如,如果我希望该值是 1 到 100 之间的随机数怎么办。我知道我总是可以运行该函数,然后将 num 字段设置为等于其输出,然后创建新对象,但我想要那个函数在模型中运行,只需调用 TestModel() 即可执行。这可能吗?
解决方案
如您所知,有多种方法可以生成随机整数,例如使用 random、numpy 等包。但也有一个名为Universally Unique IDentifieruuid
的包,它根据时间、计算机硬件(MAC 等)生成随机的 128 字节 ID。
当您使用所有这些方法在常规 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)
推荐阅读
- maven - 如何使用 Maven 以编程方式部署工件
- amazon-web-services - 从 s3 恢复极光集群或从快照恢复
- php - Laravel 应用混合内容
- php - 在 Bootstrap 和 PHP 中使用 AJAX 的模态
- ios - Swift 中的依赖注入,而不是数据
- excel - VBA:根据标题名称和列值将工作表(多列)压缩为 2 列
- c - 来自 LzmaDecode 函数 (C lzma) 的 SZ_ERROR_DATA
- c++ - 为什么是 std::thread threadObj((WorkerThread())) 而不是 std::thread threadObj(WorkerThread()())
- amazon-web-services - 为一分钟内特定数量的网站点击选择哪个 AWS Cloudwatch 警报指标?
- gradle - Gradle 项目未显示在 Intellij 新建项目向导中