0
votes

Mettre à jour le nouveau champ pour tous les utilisateurs lors de la migration

J'ai appris Django récemment. Maintenant, sur l'un des projets que je travaille, je dois ajouter un nouveau champ, is_core_administrator au modèle userprofile , qui définira l'utilisateur le plus ancien en tant qu'administrateur principal. Je dois mettre à jour ce champ pour tous les utilisateurs avec la migration. Y a-t-il un moyen de faire cela? Je veux dire, lorsque je fais des migrations, est-il possible de mettre à jour ce champ à vrai pour l'utilisateur le plus ancien et faux pour le repos. La recherche de l'utilisateur le plus ancien ne sera pas difficile car nous avons déjà un autre champ Datejoined . Je veux juste mettre à jour le champ correspondant sur la création de la migration.


0 commentaires

3 Réponses :


0
votes

Bien sûr, il suffit d'utiliser migrations.runsql ou migrations.runpython en fonction de vos besoins.

Ce dernier pourrait être plus facile à utiliser dans ce cas, mais vous devriez être capable de le faire avec une seule inscription Mettre à jour SQL.


2 commentaires

Le fichier de migration est créé après avoir appliqué les migrations correctes! J'ai ajouté un script pour modifier le champ is_core_administrator (pour l'utilisateur le plus ancien), dans un nouveau fichier créé en faisant des migrations. Comment ce script va-t-il courir à nouveau? Est-ce que j'ai de nouveau besoin d'appliquer des migrations? Demander cela parce que cela ne modifie pas ce champ is_core_administrator . Je suis curieux, quand ce script serait-il exécuté? J'ai utilisé Runpython pour être plus clair.


Vous pouvez créer un fichier de migration vide avec python manage.py makemigrations myApp --Name Seed_core_administrator --Empty , puis ajouter le runpython action là-bas. Ensuite, exécutez simplement python manage.py migrate .



0
votes

Vous pouvez le faire à l'aide de l'option RunpyThon dans les migrations Django.

Créer une fonction en haut du fichier de migration. P>

RunPython(set_default_values)


0 commentaires

0
votes

Veuillez clarifier votre cas d'utilisation. Je vois que vous avez trois options:

  1. Vous aurez peut-être besoin de la commande migrate pour effectuer cette modification chaque fois que vous avez migré votre programme. Si tel est le cas, vous devez ajouter une petite boucle à la fin du script qui serait généré par Makemigrations et si vous expédiez votre programme à l'environnement de production avec le script de migration modifié, vous pourrez le faire. LI >
  2. Si vous en avez besoin comme une modification unique de votre environnement de développement, je suggère qu'il vaut mieux modifier le script de migration, mais pour modifier IS_Core_Administrator à l'aide de Django Shell manuellement. Li>
  3. Si vous devez programmer pour définir sa première utilisation crééeProfile avec IS_Core_Administrator Set true où et quand jamais installé, je suggère que le moyen le plus simple est de définir une sauvegarde (auto): et pour vérifier si l'objet que vous allez sauvegarder est Le premier instant probablement en utilisant userprofile.Object.compte () ou userprofile.Object.exists () et définissez is_core_administrator en conséquence. Peut-être quelque chose comme suit: li> OL>
    class UserProfile(models.Model):
        ...
        ...
        is_core_administrator=models.BooleanField(default=False)
        def save(self, force_insert=False, force_update=False, using=None, 
            update_fields=None):
            if not UserProfile.objects.exists():
                self.is_core_administrator=True
            self.etiket=self.woo_name
            return models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)
    


0 commentaires