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

时间:2015-11-07 22:43:38

标签: 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)

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

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

2 个答案:

答案 0 :(得分:16)

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

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

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

class Content(models.Model):
    ......
    unique_url = models.CharField(default = random_string)

答案 1 :(得分:1)

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

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

class Content(models.Model):
    ......
    unique_url = models.CharField(default = random_string)

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

例如,如果模型中已经有500个条目。您将为每个unique_url使用相同的字符串,例如“ 548945”,这将杀死整个目的。

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

python ./manage.py shell
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()