#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.