2013-08-11 5 views
1

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

Répondre

1

Tout d'abord, la relation que vous décrivez est ce que appelle ManyToMany « à » (vous pouvez lire à ce sujet dans la documentation here). Deuxièmement, je ne comprends pas pourquoi vous avez besoin des 'heures' pour être un champ du tout. N'est-ce pas une fonction suffisante pour ça? Pourquoi l'enregistrer dans la base de données en premier lieu? vous pouvez simplement l'appeler chaque fois que vous en avez besoin. Enfin, il me semble que vous faites beaucoup de travail supplémentaire que je ne comprends pas - pourquoi avez-vous besoin du champ booléen du temps de bénévolat? Si vous liez un volontaire à un événement, n'est-ce pas assez pour savoir qu'il était là? Et quel est le but de "counts_towards_volunteer_time"? Je manque probablement une partie de la logique ici, mais beaucoup de cela semble gaspiller.

+0

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'. –

+0

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

+0

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. –

Questions connexes