2009-03-10 5 views
1

ci-dessous ne fonctionne pas tout à fait, son but est:modèles Django - ajouter conditionnellement un objet à un ManyToManyField avant d'enregistrer

À sauver, vérifier l'existence de « superviseur » dans les « opérateurs », et l'ajouter eux aussi sinon.

class JobRecord(models.Model): 
    """JobRecord model""" 

    project    = models.ForeignKey(Project) 
    date    = models.DateField() 
    supervisor   = models.ForeignKey(User, related_name='supervisor_set') 

    operators   = models.ManyToManyField(User, related_name='operators_set', help_text='Include the supervisor here also.') 

    vehicles   = models.ManyToManyField(Vehicle, blank=True, null=True) 

    def __unicode__(self): 
     return u"%s - %s" % (self.project.name, self.date.strftime('%b %d')) 

    # --- over ride methods ---- # 

    def save(self, **kwargs): 
     # this must be done to get a pk 
     super(JobRecord, self).save(**kwargs) 

     # which makes this comparison possible 
     if self.supervisor not in self.operators.__dict__: 
      self.operators.add(self.supervisor) 

     # it seems to get this far ok, but alas, the second save attempt 
     # does not seem to work! 
     print self.operators.values() 
     super(JobRecord, self).save(**kwargs) 

Merci pour votre expertise, «expert»!

+0

juste un commentaire de révision de code aléatoire. Si vous déplacez votre méthode super(). save() après votre if, et dedent, vous n'aurez plus qu'à l'appeler une seule fois. – monkut

Répondre

2

Vous pouvez faire quelque chose comme ceci pour vérifier si le superviseur est dans les opérateurs:

if self.operators.filter(id=self.supervisor.id).count() == 0: 

Et vous n'avez pas besoin d'enregistrer une seconde fois après avoir modifié le nombre à plusieurs champs. (Beaucoup à beaucoup de relations sont stockées dans leur propre table.)

+0

à mi-chemin là ... les travaux conditionnels, pourtant la méthode add() ne le fissure pas tout à fait? –

1

Ok, j'ai modifié le pour faire ce qui suit. En fait, l'un ou l'autre conditionnel semble faire l'affaire. Le problème est maintenant que la méthode add() ne fonctionne pas pour moi.

#... 

def save(self, **kwargs): 
    super(JobRecord, self).save(**kwargs) 

    if self.operators.filter(id=self.supervisor.id).count() == 0: 
    #if self.supervisor not in self.operators.values(): 

     # either conditional will get to this point 
     self.operators.add(self.supervisor) # <-- this line doesn't save proper? 
+0

Etes-vous sûr que ce n'est pas en train d'ajouter? Avez-vous une exception? Essayez d'imprimer self.operators.all() –

+0

Vous voudrez peut-être passer en revue l'utilisation de plusieurs-à-plusieurs API: http://www.djangoproject.com/documentation/models/many_to_many/ –

0

J'ai le même problème. Si vous utilisez un formulaire django, effectuez votre vérification après l'enregistrement du formulaire, puis ajoutez-en plusieurs à cet endroit. c'était la seule façon de contourner le problème.

Questions connexes