Django 为每个当前对象建模默认函数 运行

Django models default function run for every current object

models.py

class Subscription(models.Model):
    
    #... many fields ...
    
    # I added this field when I already had many objects
    uniqueSubscriptionId = models.CharField(default=generateUniqueSubscription, max_length=30)

generateUniqueSubscription

from django.utils.crypto import get_random_string


def generateUniqueSubscription():

    return get_random_string(20)

问题是,当我 运行 迁移时,我所有的旧对象都变得相同 uniqueSubscriptionId。我希望每一个旧对象都有一个唯一的 uniqueSubscriptionId.

我该怎么做?

这是我所做的:

models.py

def updateOldSubscriptionObjs(apps, schema_editor):
    old_subscription_model = apps.get_model("app_label", "Profile")

    for obj in old_subscription_model.objects.all():
        obj.uniqueSubscriptionId = generateUniqueSubscription()
        obj.save()

class Subscription(models.Model):
    
    #... many fields ...
    
    # I added this field when I already had many objects
    uniqueSubscriptionId = models.CharField(default=generateUniqueSubscription, max_length=30)

那我运行makemigrations:

python manage.py makemigrations

然后编辑最新的迁移文件:

class Migration(migrations.Migration):

    dependencies = [
        # forget this
    ]

    operations = [
        # .... many things ...
        
        migrations.RunPython(updateOldProfileObjs)
    ]

然后运行migrate:

python manage.py migrate

瞧,所有旧对象都已更新,而且任何新对象也将按照我指定的默认值进行更新。

如果你像我一样懒惰,不想做这些事情,那就打开django python shell:

python manage.py shell

然后在shell中执行这个函数:

def updateOldSubscriptionObjs():

    for obj in Subscription.objects.all():
        obj.uniqueSubscriptionId = generateUniqueSubscription()
        obj.save()

我希望是否有一些内置的 django 功能。