为什么 Django 迁移在每一行上使用相同的随机默认值?

2023-12-11

Note:

我理解并且很清楚将函数作为参数传递和调用函数并将结果作为参数传递之间的区别。我相信我正确地传递了该函数。

Specs

  • 姜戈 1.11
  • PostgreSQL 10.4

设想:

我的应用程序中有数十个模型,并且有许多现有记录。我需要向每个模型添加一个随机种子,这些模型将在创建新模型实例时创建和设置。我还想为现有实例生成随机种子。

我的理解如何Django 模型默认值 and 迁移工作原理是,当一个新字段添加到模型中时,如果该字段设置了默认值,Djano 将使用新字段和相应的默认值更新所有现有实例。

然而,尽管事实上我确实传递了一个函数作为默认值,并且该函数生成一个随机数,但 Django 在更新现有行时使用相同的随机数(例如,Djano 似乎只调用该函数一次,然后使用所有条目的返回值)。

Example

我的代码的缩短版本:

def get_random():
    return str(random.random())

class Response(models.Model):
    # various properties
    random = models.CharField(max_length=40, default=get_random)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = JSONField(null=True)

随机字段是在模型之后添加的,并且它的许多实例已经创建。 Amakemigrations命令似乎生成了正确的迁移文件,其中包含migrations.AddField()调用、传入default=get_random作为参数。

然而,运行后makemigrations,所有现有的Response实例中包含完全相同的数字random场地。创建和保存模型的新实例按预期工作(使用伪唯一随机数)。

解决方法

一种简单的解决方法是只运行一个一次性脚本,该脚本执行以下操作

for r in Response.objects.all():
    r.random = get_random()
    r.save()

或者覆盖模型的save()方法,然后进行批量保存。但我认为这些解决方法没有必要。这也意味着,如果我想创建一个具有随机默认值的唯一字段,那么我将需要多次迁移。首先,我必须添加具有指定默认值的字段。接下来,我需要应用迁移并手动重新初始化字段值。然后进行第二次迁移以添加unique=True财产。


似乎 Django 要将默认值应用于现有实例makemigrations那么它应该使用与创建新实例相同的语义来应用它们。有没有办法强制 Django 在迁移时为每个模型实例调用该函数?


要向现有表添加非空列,Django 需要使用ALTER TABLE ADD COLUMN ... DEFAULT <default_value>。这仅允许 Django 调用默认函数一次,这就是为什么您会看到每一行都具有相同的值。

您的解决方法非常正确,只是您可以使用数据迁移使用唯一值填充现有行,因此不需要任何手动步骤。文档中描述了此用例的整个过程:https://docs.djangoproject.com/en/2.1/howto/writing-migrations/#migrations-that-add-unique-fields

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Django 迁移在每一行上使用相同的随机默认值? 的相关文章

随机推荐

  • 无法创建 SqlDataSourceEnumerator

    using System using System Data using System Data Sql using System Collections namespace Tinkering with SqlDataSourceEnum
  • 我可以动态更改 asp.net 中的 FormsAuthentication cookie 名称吗?

    我想动态设置 FormsAuthentication cookie 名称 例如 guid 我怎样才能做到这一点 我已经可以在 web config 中将其更改为我想要的任何内容 我只是无法用代码和动态方式做到这一点 请帮忙
  • 生成不带公共文件系统的远程进程

    email protected 8 gt spawn email protected tut test hello 5 我想在 bar del com 上生成一个进程 它没有文件系统访问 foo hyd com 从我生成该进程的地方 运行模
  • OpenMP 并行线程

    我需要并行化这个循环 我认为使用这是一个好主意 但我以前从未研究过它们 pragma omp parallel for for std set
  • jQuery.Lazy():插件未加载我的“li”内容

    The Lazy插件对我来说不太好用 我什至添加了alerts找出问题所在 但对我来说一切都很好 我尝试使用this我的画廊插件的效果 Here是我使用 jQuery Lazy 的网站页面 HTML div class gallery bo
  • 从事件处理程序返回值到 JavaScript 的父函数

    我需要将事件处理程序返回的值放入首先启动事件的函数中 只是为了返回仅在事件处理程序中接收的值 我相信应该有一种简单的方法来实现这一点或从不同的角度解决问题 我实际上需要做的是 创建一个新的 img DOM 对象以将 dataURL 提供给其
  • 内容传输编码 7 位或 8 位

    发送电子邮件内容时 需要设置 内容传输编码 标头 我观察到收到的许多电子邮件的标题 有些电子邮件使用 7bit 有些则使用 8bit 这两者有什么区别 推荐哪个 电子邮件正文是否需要任何特殊编码才能设置这些标头 阅读起来可能有点密集 但 R
  • 是否可以发送 WM_COPY 消息来将文本复制到剪贴板以外的其他位置?

    这是方法定义 DllImport user32 dll public static extern int SendMessage IntPtr hWnd int msg IntPtr lparam IntPtr wparam 这是对 Sen
  • 如何将数组(Google 应用脚本)返回到 HTML 侧边栏?

    我想将我在 code gs 中创建的一些数组返回到 HTML 侧边栏并使用它来填充选择 到目前为止我有这个 假设我想使用 this part of the array for the select 作为 html 选择 code gs fu
  • 在 SwiftUI 列表中呈现 Realm 数据的正确方法是什么

    我正在尝试从中获取所有项目Realm并将它们显示在SwiftUI List但我不断收到错误 In a UIKit Realm应用程序 我只想创建一个Results变量来存储所有项目Realm然后 我会获取中的项目viewDidLoad方法并
  • 类型错误:不可排序的类型:str() < int()

    我使用的是 python 3 5 所有包都是以下版本 numpy 1 12 0b1 mkl cp35 cp35m win amd64 scikit learn 0 18 1 cp35 cp35m win amd64 scipy 0 18 1
  • 在div之上创建一个浮动div

    我正在尝试创建类似以下的内容 div 1 div2 on top of div1 div3 div2 div3 我想创建一个div2在两者之上div1 and div3 我真的不知道如何做到这一点 有人可以帮我吗 谢谢 您
  • SwiftUI @Binding 初始化

    一直在玩 SwiftUI 并理解了这个概念BindableObjects到目前为止等等 至少我希望如此 我遇到了一个愚蠢的问题 我似乎找不到答案 你如何初始化一个 Binding多变的 我有以下代码 struct LoggedInView
  • 将不同的格式应用于不同的列数据框

    我有以下 df table A B C D 0 0 000000 0 000000 0 002520 0 002520 1 0 209772 0 016262 0 003411 0 024343 2 0 006474 0 000152 0
  • c++ OpenCV 将 Mat 转换为一维数组

    我有这个Mat Mat testDataMat 386 2 CV 32FC1 testDataFloat 其中取自 float testDataFloat 386 2 但我不知道如何将它变成一维数组 有什么帮助吗 样本包括 从浮点二维数组转
  • android viewPager 实现 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我的任务是向右滚动到另一个屏幕 然后按图标并显示弹出窗口 我想用ViewPager在两个
  • 在gui线程中触发异步事件

    TL DR 我正在寻找一种方法让一个线程在另一个线程中引发事件 EDIT 我说的是 立即 这个词 正如一些评论者指出的那样 这是不可能的 我的意思是 如果 gui 线程空闲的话 它应该相当快地发生 在低毫秒到纳秒的范围内 如果我做得正确 它
  • CSS3 过渡 + 不显示 + 防止过度滚动

    因此 如果您还不熟悉 CSS3 过渡不会产生动画display none因为它从 DOM 中完全删除了目标元素 这是我的问题 我有一个侧边栏 其中悬停时会出现更大的弹出 div 不幸的是 因为我只能过渡visibility hidden a
  • 在 Express (node.js) 中动态限制上传文件大小

    我正在开发一个简单的应用程序 允许用户上传他们的内容 我想限制 Express 接受的文件大小 我知道我可以使用 app use express limit 2mb 但是我要动态改变限制 某些用户会有更高的限制 最好的解决方案是首先检查co
  • 为什么 Django 迁移在每一行上使用相同的随机默认值?

    Note 我理解并且很清楚将函数作为参数传递和调用函数并将结果作为参数传递之间的区别 我相信我正确地传递了该函数 Specs 姜戈 1 11 PostgreSQL 10 4 设想 我的应用程序中有数十个模型 并且有许多现有记录 我需要向每个