2009-11-19 3 views
0

je les modèles Django suivants: -Besoin d'aide à la conception de modèle Django, ManyToManyField « à travers » un modèle intermédiaire et ses implications pour l'unicité

class Company(models.Model): 
    name = models.CharField(max_length=50) 
    is_active = models.BooleanField(db_index=True) 

class Phase(models.Model): 
    company = models.ForeignKey(Company) 
    name = models.CharField(max_length=50) 
    is_active = models.BooleanField(db_index=True) 

class Process(models.Model): 
    company = models.ForeignKey(Company) 
    name = models.CharField(max_length=50)  
    phases = models.ManyToManyField(Phase, through='ProcessPhase') 
    is_active = models.BooleanField(db_index=True) 

class ProcessPhase(models.Model): 
    process = models.ForeignKey(Process) 
    phase = models.ForeignKey(Phase) 
    order = models.PositiveIntegerField(help_text="At what step of your process will this phase occur?", unique=True) 

Une « société » a ses « processus » et « phases » . Un processus (d'une entreprise) est composé d'une ou plusieurs phases (de l'entreprise). Chaque phase associée à un processus a un "ordre". L'exigence est que: -

  1. dans un processus particulier d'une entreprise, une phase ne peut apparaître qu'une seule fois;
  2. également "phase A" et "phase B" dans un processus ne peut pas avoir le même ordre.

donc je dois savoir: -

a) comment spécifier certains de « uniques » dans la définition du modèle pour répondre aux exigences ci-dessus;

b) quel caractère unique, le cas échéant, est automatiquement impliqué par un objet ManyToManyField?

Répondre

3

Dans votre cas, puisque vous dites « Un processus (d'une entreprise) est composé d'une ou plusieurs phases (de la société) », il semble que vous devriez avoir une structure comme:

Company <----* Process <----* Phase 

La société a ses processus, processus a ses phases. Ce n'est pas vraiment une relation ManyToMany, c'est OneToMany (Le processus a plusieurs phases, mais chaque phase est connectée à un processus).

Si oui, vous devriez avoir

class Phase(models.Model): 
    process = models.ForeignKey(Process, null=True) # based on your comment, if a Phase does not belong to a Process, leave it null. 
    phase = models.ForeignKey(Phase) 
    order = models.PositiveIntegerField(help_text="At what step of your process will this phase occur?") 


    class Meta: 
     unique_togather = ("process", "order") 

Le unique_together dans Meta classe est ce que vous voulez, je pense. Il applique à la fois dans l'admin et au niveau de la base de données l'unicité de ces 2 champs ensemble.


modifier:
(ForeignKey champ peut être nul - voir this)


en fonction de votre commentaire:

Ne pas utiliser ManyToMany, car il génère automatiquement la " table-dans-le-milieu ", alors que vous en avez besoin spécifique pour vos besoins. Au lieu de cela, essayez de définir le modèle différent (avec votre Company, Phase et Process):

class PhaseOrder(models.Model): 
    process = models.ForeignKey(Process) 
    phase = models.ForeignKey(Phase) 
    order = models.PositiveIntegerField(help_text="At what step of your process will this phase occur?") 
    class Meta: 
    unique_together = (("process", "order"), ("process", "phase")) 
+0

J'ai cette structure plus tôt. Mais du point de vue des utilisateurs, ils créent des processus et des phases. Les phases sont similaires dans chaque processus, mais leur ordre peut être différent dans différents processus. – chefsmart

+0

Ensuite, vous n'avez pas besoin du champ ManyToMany défini, juste un tableau supplémentaire. Vérifiez ma dernière modification. L'unicité est garantie avec unique_together dans Meta. – kender

+0

S'il y a un projet "A" et un projet "B" qui ont tous deux une phase "d'installation", est-ce une phase d'installation partagée entre les projets ou deux phases d'installation, une pour chaque projet? Je dirais que c'est probablement deux, car "A.setup" pourrait être actif quand "B.setup" ne l'est pas. Juste dire que certains "setup" est actif n'est probablement pas très significatif? Si oui, je pense que Kender a la bonne réponse. –

1

Une phase ne devrait-elle pas toujours appartenir à un processus? Si tel est le cas, vous pourriez dire que la combinaison Processus et ordre d'une phase doit être unique.

+0

Une phase ne « toujours » pas nécessairement appartenir à un processus. Ce que je veux dire, c'est qu'il pourrait y avoir une phase qui n'est pas (encore) associée à un processus. – chefsmart

+1

Mais une Phase non attachée à un processus n'aura pas d'entrées dans ProcessPhase, donc l'instruction de Rasmus est toujours valide. –

Questions connexes