Python 相关模型Django的随机默认值

Python 相关模型Django的随机默认值,python,django,Python,Django,我有一个模型汽车和模型保险杠有关的汽车。如何在Django中将保险杠的汽车的默认值设置为随机汽车对象?您可以使用以下功能: from random import randrange def random_car(): n = Car.objects.count() return Car.objects.all()[randrange(n)] class Bumper(models.Model): car = models.ForeignKey(Car, on_dele

我有一个模型汽车和模型保险杠有关的汽车。如何在Django中将保险杠的汽车的默认值设置为随机汽车对象?

您可以使用以下功能:

from random import randrange

def random_car():
    n = Car.objects.count()
    return Car.objects.all()[randrange(n)]

class Bumper(models.Model):
    car = models.ForeignKey(Car, on_delete=models.CASCADE, default=random_car)
来自随机导入范围
def random_car():
n=Car.objects.count()
返回Car.objects.all()[randrange(n)]
保险杠等级(型号.型号):
车=车型。外键(车,on_delete=models.CASCADE,默认值=随机车)

尽管如此,我不确定使用随机
汽车是否是个好主意。通常,您希望创建/更改/删除实体的内容是确定性的。通过使事情随机化,使调试、分析等变得更加困难。代码流。

您可以使用以下函数:

from random import randrange

def random_car():
    n = Car.objects.count()
    return Car.objects.all()[randrange(n)]

class Bumper(models.Model):
    car = models.ForeignKey(Car, on_delete=models.CASCADE, default=random_car)
来自随机导入范围
def random_car():
n=Car.objects.count()
返回Car.objects.all()[randrange(n)]
保险杠等级(型号.型号):
车=车型。外键(车,on_delete=models.CASCADE,默认值=随机车)

尽管如此,我不确定使用随机
汽车是否是个好主意。通常,您希望创建/更改/删除实体的内容是确定性的。通过使事情随机化,您就更难调试、分析等代码流。

我尝试了与您类似的版本,但使用了random.choice(),问题是Django每次迁移只重新计算一次随机值。此外,每次无限次输入makemigrations命令时,它都会重新计算随机值,因此这似乎不是一个可行的方法example@kenshin:您可能在默认情况下调用了该方法,但您不应该这样做,您应该指定
default=random\u car
so而不使用括号。使用
choice
也是一种有问题的方法,因为这会将所有
汽车
加载到内存中,因此最终,如果
汽车
的数量增加,它会耗尽内存。@kenshin:如果你写
default=random_Car()
,那么它在解释类时当然会调用函数,并保存函数的结果,这实际上只会在启动服务器时随机化。但是,如果您传递一个可调用项,Django每次都会调用它,如果它必须生成一个随机项。因此,基本上,随机操作必须在Django中执行,并在调用到达api之前生成。@kenshin:您传递给
default=…
一个对函数的引用,而不是函数的结果。字段中的逻辑是它将调用函数。如果该函数每次都提供不同的值,那么每次都将使用不同的值。我尝试了与您类似的版本,但使用了random.choice(),问题是Django只为每次迁移重新计算一次随机值。此外,每次无限次输入makemigrations命令时,它都会重新计算随机值,因此这似乎不是一个可行的方法example@kenshin:您可能在默认情况下调用了该方法,但您不应该这样做,您应该指定
default=random\u car
so而不使用括号。使用
choice
也是一种有问题的方法,因为这会将所有
汽车
加载到内存中,因此最终,如果
汽车
的数量增加,它会耗尽内存。@kenshin:如果你写
default=random_Car()
,那么它在解释类时当然会调用函数,并保存函数的结果,这实际上只会在启动服务器时随机化。但是,如果您传递一个可调用项,Django每次都会调用它,如果它必须生成一个随机项。因此,基本上,随机操作必须在Django中执行,并在调用到达api之前生成。@kenshin:您传递给
default=…
一个对函数的引用,而不是函数的结果。字段中的逻辑是它将调用函数。如果该函数每次提供不同的值,则每次将使用不同的值。