Функции моделей Django по умолчанию выполняются для каждого текущего объекта

#python #django #django-models

Вопрос:

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 .

Как я могу это сделать?

Ответ №1:

Вот что я сделал:

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:

python manage.py shell

а затем выполните эту функцию в оболочке:

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

Я хотел бы, чтобы для этого была какая-нибудь встроенная функция django.