gpt4 book ai didi

数据迁移中的 Django & South : Custom field methods are not executed when doing obj. save()

转载 作者:行者123 更新时间:2023-12-04 15:14:06 24 4
gpt4 key购买 nike

在我的 Django 模型中,我有两个字段,name (常规 CharField )和 slug ,一个自定义字段,它根据字段定义中传递的字段名称生成 slug,在这种情况下,我使用 name为了这。

首先,该模型只有 name字段,以及相应的迁移和所有。然后我需要添加 slug字段,因此遵循南方惯例,我添加了带有 unique=False 的 slug 字段,创建架构迁移,然后创建数据迁移,设置unique=True并为最后一次更改创建另一个迁移。

由于 slug 的值是在模型保存时生成的,因此在 forwards我所做的数据迁移方法是遍历 orm['myapp.MyModel'].objects.all() 返回的查询集并调用save()每个实例上的方法。

但是 slug 字段的值永远不会生成。在 IPython session 中,我做了同样的事情,但将模型引用为 from myapp.models import MyModel ,并工作。使用一些调试语句,打印 type South 的 orm dict 返回的模型显示了真实的类,它似乎不是 South 即时构建的假模型。

pre_save 时,slug 字段会创建它的值。方法。如何在数据迁移期间强制调用它?我需要确保值的唯一性,以便在以后的架构迁移中应用索引时,列不包含重复值。

谢谢!

顺便说一句:slug 字段类确实定义了 south_field_triple所以南方玩得很好。

编辑 : 请看my answer .但更像是一个答案,感觉更像是一个黑客。有没有更好/正确的方法来做到这一点?

最佳答案

通常,您应该在迁移中尽可能地显式复制生成字段内容的代码(有目的的代码复制的罕见示例)。您的方法中的代码即使有效,也会按照执行迁移时的定义调用 pre_save,这可能在创建迁移时已更改甚至因模型状态而失败(它可能取决于其他字段而不是在更早的时间出现等)。

因此,您示例中的正确方法是直接使用 slugify() ,就像在 SlugField 的 pre_save 方法中所做的那样:

from django.template.defaultfilters import slugify

class Migration(DataMigration):

def forwards(self, orm):
"Write your forwards methods here."

for myobj in orm['myapp.MyModel'].objects.all():
myobj.slug = slugify(myobj.otherfield)
myobj.save()

关于数据迁移中的 Django & South : Custom field methods are not executed when doing obj. save(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11505519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com