如何设置随机整数作为Django CharField的默认值?

dar*_*rse 8 python django django-models django-admin

我的models.py看起来像这样:

import random
random_string = str(random.randint(10000, 99999))

class Content(models.Model):
    ......
    unique_url = models.CharField(default = random_string)
Run Code Online (Sandbox Code Playgroud)

当我在admin中添加内容时,会生成该范围内的整数并将其作为其默认值放入charfield.从那里,我可以简单地在charfield中添加更多单词.但是,我当前设置的问题是每次添加新文章时整数都保持不变.我想生成并插入随机整数,因为我使用unique_url字段基本上找到我的每个特定对象,我期待很多内容,所以添加随机数通常会确保每个内容都有一个kind unique_url.

因此,我正在寻找一个系统,每次使用管理面板添加新内容时生成随机整数,并将其作为字段的默认值.在Django中这样的事情是否可能?

Wto*_*wer 18

这样您就可以生成一次随机数.您需要定义一个函数,例如:

def random_string():
    return str(random.randint(10000, 99999))
Run Code Online (Sandbox Code Playgroud)

然后定义你已经拥有的模型,而不是()为了传递对函数本身的引用而不是函数返回的值:

class Content(models.Model):
    ......
    unique_url = models.CharField(default = random_string)
Run Code Online (Sandbox Code Playgroud)

  • **警告**:当您创建字段并迁移现有数据库时,该函数将仅运行一次并使用相同的“随机”数字进行更新。如果模型中已有 500 个条目。对于每个“unique_url”,您将拥有相同的字符串,例如“548945”,这将破坏整个目的。 (6认同)

Tes*_*ter 5

您可以通过传递函数作为默认值来生成随机字符串。该函数将运行并使用函数的返回值设置默认值。引用@Wtower 给出的例子。

def random_string():
    return str(random.randint(10000, 99999))

class Content(models.Model):
    ......
    unique_url = models.CharField(default = random_string)
Run Code Online (Sandbox Code Playgroud)

但这有一个警告:当您创建字段并迁移现有数据库时,该函数将仅运行一次并使用相同的“随机”数字进行更新。

例如,如果模型中已有 500 个条目。对于每个 unique_url ,您将拥有相同的字符串,例如“548945”,这将破坏整个目的。

您可以通过更改数据库中现有条目的值来克服这个问题。这是一次性工作,可以使用django shell.

python ./manage.py shell
Run Code Online (Sandbox Code Playgroud)
from appname.models import Content, random_string 
# Change appname and file name accordingly

entries = Content.objects.all()
for entry in entries :
    entry.unique_url = random_string()
    entry.save()

Run Code Online (Sandbox Code Playgroud)

  • 我以为还有另一种方法。我实际上是在迁移中这样做的:(1) 使用 unique = False [migration N] 创建我的字段,然后 (2) 使用这种脚本编写迁移来填充现有对象 [migration N+1],然后 (3) Put Unique = True 约束 [迁移 N+2] (3认同)