Dans mes modèles, j'ai une classe Event
, une classe Volunteer
et une classe Session
. La classe Session a un champ de clé étrangère pour un événement et un volontaire, et est un couplage unique des deux, ainsi qu'une date et une heure. Pris ensemble, le bénévolat et l'événement, je pense techniquement avoir une relation ManyToMany. En utilisant l'admin Django pré-emballé, j'édite les Volontaires et les Événements avec leurs propres classes admin.ModelAdmin
respectivement. Les sessions sont éditées en ligne dans les événements ModelAdmin
. Lorsque j'ajoute une nouvelle Session à un événement dans l'interface d'administration, avec un Volontaire, le champ hours
du Volontaire doit être automatiquement mis à jour pour refléter le nombre d'heures de la dernière session ajoutée (plus toutes les sessions passées). Actuellement, j'ai juste une fonction calculate_hours
dans le modèle Volunteer
, qui itère sur toutes les sessions chaque fois qu'il est appelé et trouve la somme des heures. J'ai essayé de l'appeler avec une fonction d'enregistrement personnalisée dans Session, mais il ne semble jamais être appelé après la fonction d'enregistrement d'événement. Je l'essayerais dans Event, mais je n'ai aucun moyen d'isoler les Volontaires qui ont besoin de recalculer leurs heures. Le champ des heures est mis à jour si je me rends manuellement à la page d'administration du Volunteer, modifiez, puis enregistrez le Volunteer, mais c'est inacceptable.Comment enregistrer un modèle django en ligne associé lorsque le parent est enregistré dans l'admin?
Je vois qu'il y a beaucoup de questions sur SO concernant les problèmes de Django lors de la sauvegarde des objets en ligne sur le site d'administration, en particulier avec les champs ManyToMany. Je ne suis pas sûr, après avoir lu plusieurs de ces questions, si ce qu'ils disent s'applique dans mon cas - peut-être que je dois recevoir un signal quelque part, ou inclure une sauvegarde personnalisée dans un endroit spécial, ou appeler save_model
dans ma classe admin.ModelAdmin
. .. Je ne sais pas. Quelle est la meilleure manière de s'occuper de ça?
code se trouve ici: Models.py, Admin.py
Merci pour votre réponse. Donc j'ai besoin de définir explicitement 'ManyToManyField' sur ma classe Event? Jusqu'à présent, j'utilisais simplement les champs liés comme 'Event.session_set' pour obtenir toutes mes données et cela semblait fonctionner. Sauf pour cette chose d'économie. Honnêtement, j'espérais que le champ des heures finirait par me permettre de ne pas répéter toutes les sessions à chaque fois, puisque les données avec lesquelles je travaille ont quelques bénévoles avec une longue histoire. Au départ, je l'avais configuré pour appeler la fonction. Le champ 'volunteer_time' représente si une session est comptée ou non vers les' heures'. –
Vous n'avez pas besoin de le définir explicitement, mais il y a certains avantages (sur le plan des requêtes). En ce qui concerne le champ "heures", je ne comprends toujours pas pourquoi vous voulez l'enregistrer dans la base de données. Vous pouvez simplement utiliser la fonction (si vous voulez faire une requête, faites-le dans la liste de compréhension: [v.calc_hours() pour v dans Volunteer.objects.all()] – yuvi
Bien, mais dites qu'un volontaire a 1000 sessions associées Avec eux, pourquoi parcourir chaque session chaque fois qu'une seule session est enregistrée?Je pourrais éventuellement ajouter simplement la valeur de la longueur de la session à la valeur déjà stockée des heures, et ne pas avoir à faire tout ce travail à chaque fois. –