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 功能。
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 功能。