【问题标题】:How to set a random integer as the default value for a Django CharField?如何将随机整数设置为 Django CharField 的默认值?
【发布时间】:2015-11-07 22:43:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 警告:当您创建字段并迁移现有数据库时,该函数将只运行一次并使用相同的“随机”数字进行更新。如果模型中已有 500 个条目。对于每个unique_url,您将拥有相同的字符串,例如“548945”,这将扼杀整个目的。
    • 我就是有这个问题。如果你有一个已经填充的数据库然后@Tessaracter,你会怎么做?
    • @Sam 您需要使用objects 属性更改数据库中的值。我现在会为此写一个答案。
    • 向现有模型添加唯一字段有一个很好的选择,您可以在这里找到stackoverflow.com/a/56935231/2035870
    【解决方案2】:

    您可以通过将函数作为默认值传递来生成随机字符串。该函数将运行并使用函数的返回值设置默认值。引用@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()
    
    

    【讨论】:

    • 我认为还有另一种方法。我实际上是在迁移中这样做的:(1)使用 unique = False [migration N] 创建我的字段,然后(2)使用这种脚本编写迁移以填充现有对象 [migration N+1],然后(3)放置Unique = True 约束 [迁移 N+2]
    • 哦,酷。我认为最明显的解决方案是更改数据库中的条目。虽然我希望有一种更 Pythonic 的方式来做到这一点。
    猜你喜欢
    • 2021-08-16
    • 1970-01-01
    • 2015-06-14
    • 2013-06-29
    • 2017-07-14
    • 2021-09-21
    • 2016-05-04
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多