2 votes

Django, South et la commande --freeze

J'essaie de me lancer dans les migrations de données vers le Sud. J'ai trouvé cette question sur le SO : Erreur d'instance lors de la migration des données vers le sud en utilisant le formulaire de congélation vers le sud et j'ai essayé les commandes qui y sont mentionnées, mais cela ne semble pas aider.

J'ai 2 applications A et B dans mon projet, voici leurs modèles :

# /app_A/models.py
from django.db import models 
class Employee(models.Model): 
    name = models.CharField(max_length = 100) 
    department = models.ForeignKey("Department")
    manager = models.ForeignKey("self", blank = True, null = True)
    birthdate = models.DateField()

# /app_B/models.py
from django.db import models
from hr_manager.models import Employee
class Task(models.Model):
    title = models.CharField(max_length=50)
    description = models.TextField()
    assigned_to = models.ForeignKey(Employee, null=False, blank=False)
    seniority = models.IntegerField(default=0)
    age = models.IntegerField(default=0)

J'essaie de générer une migration de données pour app_B afin qu'il calcule l'âge et la séniorité de l'employé auquel la tâche est assignée et qu'il les stocke dans la tâche elle-même. J'ai exécuté :

./manage.py datamigration app_B populate_age_and_senority --freeze app_A

l'option --freeze devrait rendre les modèles de app_A disponibles dans la migration à travers orm['app_1.']. J'ai ensuite édité la migration créée de cette manière :

from south.db import db
from south.v2 import DataMigration
from django.db import models
class Migration(DataMigration):
def forwards(self, orm):
    import datetime
    def calculate_age(born):
        ''' Returns the age from a starting date '''
        ...
    birthdate = orm['hr_manager.Employee'].birthdate
    date_joined = orm['hr_manager.EmployeeHistory'].date_joined
    orm.Task.age = calculate_age(birthdate)
    orm.Task.seniority = calculate_age(date_joined)
    orm.Task.save()
def backwards(self, orm):
    raise RuntimeError("Cannot reverse this migration.")

Puis il a couru :

./manage.py migrate app_B

Voici ce que j'ai obtenu :

AttributeError: type object 'Employee' has no attribute 'birthdate'

Ai-je fait quelque chose de mal ?

Merci d'avance pour votre aide !

2voto

dlamotte Points 2912

La ligne :

orm['hr_manager.Employee']

Accède à la Model et non une instance. Vous devez accéder à une instance par la voie habituelle :

orm['hr_manager.Employee'].objects.all()
orm['hr_manager.Employee'].objects.get(...)
...

des méthodes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X