2011-04-14 2 views
3

Je souhaite enregistrer un objet pour que le M2M soit enregistré. Ensuite, je veux lire les champs M2M pour faire des calculs et définir un champ sur l'objet enregistré.Obtention de l'ID de l'objet nouvellement créé dans save()

class Item(models.Model): 
    name = models.CharField(max_length=20, unique=True) 
    product = models.ManyToManyField(SomeOtherModel, through='SomeTable') 

    def save(self, *args, **kwargs): 
     super(Item, self).save(*args, **kwargs) 
     m2m_items = SomeTable.objects.filter(item = self) 
     # DO SOME STUFF WITH THE M2M ITEMS 

Les m2m_items ne s'afficheront pas. Y a-t-il un moyen de les obtenir?

Répondre

4

Une certaine confusion ici. Une fois que vous avez appelé super, self.id aura une valeur.

Cependant, je ne comprends pas le point de votre appel filter. Pour commencer, vous voulez probablement dire get plutôt que filter de toute façon, car le filtre obtient un jeu de requête plutôt qu'une seule instance. Mais même ainsi, l'appel est inutile: vous avez juste enregistré, donc tout ce que vous obtenez de la base de données sera exactement le même. À quoi ça sert?

Modifier après mise à jour de la question OK, merci pour la clarification. Cependant, la méthode du modèle n'est pas responsable de faire quoi que ce soit avec des éléments M2M. Ils doivent être sauvegardés séparément, ce qui est le travail du formulaire ou de la vue.

+0

Désolé ma mauvaise, j'ai mis l'information mal. J'ai réécrit ma question. Ce que je fais, c'est que j'essaie d'obtenir les nombreux objets. Mais pour une raison quelconque, ils ne se présenteront pas – Stephan

+0

Merci pour votre réponse. J'essaie d'utiliser le signal m2m_changed maintenant. models.signals.m2m_changed.connect (set_total_price, sender = Deal.product.through) Il n'appellera pas ma méthode set_total_price pour une raison quelconque. Cela fonctionne avec le signal post_save ... Eh bien, j'ai encore des choses à essayer. Merci beaucoup. – Stephan

+0

Pour en savoir plus: J'ai fini par lire le M2M dans le save_formset en itérant sur les instances. Ensuite, j'ai appelé l'élément enregistré et enregistré avec la nouvelle valeur. – Stephan

Questions connexes