Skip to content

Problème sur le champ incompatibilites de l'unite qui créé une migration a l'installation pour rien.#63

Open
lvillanne-recia wants to merge 3 commits intoNoethys:mainfrom
GIP-RECIA:PR_migration1
Open

Problème sur le champ incompatibilites de l'unite qui créé une migration a l'installation pour rien.#63
lvillanne-recia wants to merge 3 commits intoNoethys:mainfrom
GIP-RECIA:PR_migration1

Conversation

@lvillanne-recia
Copy link
Copy Markdown
Contributor

@lvillanne-recia lvillanne-recia commented Apr 16, 2026

Bonjour,

Lors de la procédure d'installation, au moment de faire le python3 manage.py makemigrations django génére deux requêtes de migration, une sur le modèle unite et une autre relative aux permissions (#64).

Cette PR a pour but de supprimer une fois pour toute cette requête de migration sur le modèle unite car cette requête vient d'une imprécision qui fait que Django ne se comporte pas de la même façon en fonction de sa version.

Voici le détail du problème :

Tout d'abord voici la migration généré :

migrations.AlterField(
    model_name='unite',
    name='incompatibilites',
    field=models.ManyToManyField(blank=True, related_name='_core_unite_incompatibilites_+', to='core.Unite', verbose_name='Incompatibilités'),
),

Je constate que dans la migration 192 du 27/09/2025 il y'a une modif sur ce même field :

migrations.AlterField(
    model_name='unite',
    name='incompatibilites',
    field=models.ManyToManyField(blank=True, to='core.unite', verbose_name='Incompatibilités'),
),

Et encore avant sur la migration 168 du 09/11/2024 il y'a une modif sur ce même field :

migrations.AlterField(
    model_name='unite',
    name='incompatibilites',
    field=models.ManyToManyField(blank=True, related_name='_core_unite_incompatibilites_+', to='core.Unite', verbose_name='Incompatibilités'),
),

Donc la migration bascule d'un état a l'autre en fonction de quelque chose et je pense que ce quelque chose est la version de Django.
En effet, après avoir fait quelques recherches, il s'agit d'un problème connu sur Django quand il y'a plusieurs fields qui pointent sur self, ce qui est le cas ici sur Unite avec incompatibilites, dependances et solidaires.
Une bonne pratique pour éviter ce genre de problème est de toujours définir un related_name explicitement sur les fields qui pointent sur self, cela évite a Django de se mélanger lors de la génération automatique entre plusieurs champs pointant sur self.
solidaires n'est pas affecté car il a déjà un related_name, il ne reste donc que incompatibilites à fixer pour régler ce problème dependances.

Il y'a une subtilité en plus pour incompatibilites car j'ai aussi dû définir symmetrical à False, or comme avant le code enregistrait automatiquement la relation inverse, j'ai dû écrire un morceau de code pour faire a la main l'enregistrement de la relation inverse pour conserver le même fonctionnement.

J'ai ajouté une série de tests pour montrer que ce code permet de conserver le même comportement qu'avant pour sauver la relation inverse quand le formulaire est utilisé.
Pour lancer la série de test :

python manage.py test parametrage.tests.test_incompatibilites_unites

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant