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)

Надеюсь, это поможет решить вашу проблему.

Вернуться на верх