Django - Значение по умолчанию на основе другого поля модели
Это моя существующая модель django
class Account(models.Model):
env = CharField(max_length=10)
Теперь мне нужно добавить поле period
в мою модель на основе значения поля env
в модели. Я могу получить значение period
на основе env
из следующего диктанта в моем settings
файле
mydict = {
'dev':1,
'prd':2
}
Как добавить поле периода в модель?
period = Integerfield(default=setvalue from dict)
Вы можете сделать пользовательскую миграцию после выполнения makemigrations
, вы открываете созданный файл миграции и добавляете функцию, подобную этой
from django.db import migrations
def set_default_value(apps, schema_editor):
Account = apps.get_model("YOURAPPNAME", "Account")
for account in Account.objects.all():
if account.end == "dev":
account.period = 1
elif ...
...
account.save()
class Migration(migrations.Migration):
dependencies = [
(...),
]
operations = [
migrations.AddField(...),
migrations.RunPython(
set_default_value,
),
]
Дополнительная информация о данных миграции: https://docs.djangoproject.com/fr/4.1/topics/migrations/#data-migrations
Вот решение с использованием сигналов
from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.conf import settings
class Account(models.Model):
env = CharField(max_length=10)
period = Integerfield(blank=True)
@receiver(pre_save, sender=Account)
def account_pre_save(sender, instance, **kwargs):
if instance.period is None:
env = instance.env.lower()
instance.period = settings.mydict.get(env)
Надеюсь, это поможет решить вашу проблему.