Прежде всего, миграции происходят в порядке, который определяется при создании файла миграции.
# 0001_initial.py
...
operations = [
migrations.CreateModel(
name=modelA,
....
),
migrations.CreateModel(
name=modelB,
....
),
]
Вы можете проверить файлы миграции и убедиться, что modelA
раньше modelB
.
Во-вторых, modelA.get_active_attribute()
нужна запись в БД, чтобы иметь возможность что-то вернуть. Во время выполнения миграции вы не вставляете данные. Таким образом, вы не должны объявлять default
объектом другой модели.
Вместо этого вы должны переопределить save()
, чтобы убедиться, что значение по умолчанию основано на атрибуте modelA
.
class modelB(models.Model):
attribute = models.IntegerField()
def save(self, *args, **kwargs):
if self.attribute is None:
self.attribute = modelA.get_active_attribute()
super(modelB, self).save(*args, **kwargs)