2009-12-10 3 views
0

Voici mon exemple:Comment restreindre les modèles clés étrangères à des objets étrangers ayant la même propriété

Nous avons des imprimantes. Nous pouvons définir des formats de page liés à une imprimante spécifique puis définir des workflows qui sélectionnent un format de départ (première page ajoutée au travail d'impression), un format de corps et un format final (dernière page ajoutée au travail d'impression).

début et de fin ne sont pas nécessaires (nul et vierge = True)

Je veux être sûr que début, le corps et la fin seront les formats de la même imprimante.

class Printer(models.Model): 
    name = models.CharField(max_length = 20) 

class Format(models.Model): 
    name = models.CharField(max_length = 20) 
    format = models.TextField() 
    printer = models.ForeignKey(Printer) 

class Workflow(models.Model): 
    name = models.CharField(max_length = 20) 
    startfmt = models.ForeignKey(Format, related_name = 'start_workflow', null = True, blank = True) 
    bodyfmt = models.ForeignKey(Format, related_name = 'start_workflow') 
    endfmt = models.ForeignKey(Format, related_name = 'start_workflow', null = True, blank = True) 

donc j'ai besoin ce modèle pour valider que startfmt, bodyfmt et formats de référence endfmt qui partagent la même imprimante ... comment?

Répondre

1

Votre meilleur pari est probablement overriding save dans le modèle de workflow:

class Workflow(models.Model): 
    # field definitions as you have them 

    def save(self, force_insert=False, force_update=False): 
     printer = self.bodyfmt.printer 
     if self.startfmt and self.startfmt.printer != printer: 
      raise ValueError("Startfmt printer does not match") 
     if self.endfmt and self.endfmt.printer != printer: 
      raise ValueError("Endfmt printer does not match") 

     super(Workflow, self).save(force_insert, force_update) 
Questions connexes