2017-10-20 9 views
0

Je suis un peu nouveau sur django. En écrivant les modèles pour une application que je fais, j'ai eu l'impression de faire quelque chose de mal à cause de toutes les clés étrangères que j'utilisais pour un seul modèle (modèle de ticket spécifique)Beaucoup de clés étrangères dans un modèle, une meilleure façon de faire des modèles?

que je voulais que chaque ticket conserve les informations sur son créateur, à quelle équipe ce ticket est assigné et aux commentaires faits sur le ticket. Et d'autres informations qui n'ont pas besoin de clés étrangères. Est-ce que je fais ça bien? Je ne sais pas pourquoi, mais je pense qu'il y a un meilleur moyen.

class Team(models.Model): 
    name = models.CharField(max_length=200) 
    description = models.CharField(max_length=2000) 
    members = models.ManyToManyField(User, through='Team_members') 

    def __str__(self): 
     return self.name 



class Ticket(models.Model): 
    name = models.CharField(max_length=200) 
    creator = models.ForeignKey(User, on_delete=models.CASCADE) 
    team = models.ForeignKey(Team, on_delete=models.CASCADE) 
    comments = models.ForeignKey(Comment, on_delete=models.CASCADE) 
    #worker = models.ForeignKey(User, on_delete=models.CASCADE) *to be finished 
    description = models.CharField(max_length=500) 
    status = models.BooleanField(default=False) 
    date_opened = models.DateTimeField('date opened') 
    date_closed = models.DateTimeField('date closed',null=True, blank=True) 
    def __str__(self): 
     return self.name 



class Team_member: 
    team = models.ForeignKey(Team) 
    user = models.ForeignKey(User) 
    date = models.DateTimeField('date joined') 

class Comment: 
    text = models.CharField(max_length=2000) 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    def __str__(self): 
     return self.text 
+0

En outre, un soupçon, [auto_now_add] (https://docs.djangoproject.com/en/1.11/ref/models/ fields/# django.db.models.DateField) vous aidera avec 'DateField' /' DateTimeField' sur 'Team_member' et' date_opened' sur 'Ticket'. – Art

+0

Juste un indice Django: Voyez si GenericRelations aidera votre système. Vous pouvez bénéficier de remplacer le FK Ticket.comments par un GR. https://simpleisbetterthancomplex.com/tutorial/2016/10/13/how-to-use-generic-relations.html – White

Répondre

1

Votre question a en fait très peu (comme, rien?) À faire avec Django. S'il vous plaît lire à propos de database normalization, il devrait répondre à vos questions.

En ce qui concerne vos modèles, je pourrais remarquer ce qui suit:

  • Vos modèles semblent assez bon. N'ayez pas peur des clés étrangères, elles sont la principale raison pour laquelle vous utilisez une base de données relationnelle :)
  • Je suppose, User peut être un membre d'un Team (service?) Ou quelqu'un qui ouvre un ticket. Si oui: quand vous aurez la clé étrangère worker, vous n'aurez probablement pas besoin de team dans le modèle Ticket. Il sera redondant, car worker aurait une relation avec Team.
  • tatillonne: Team_member n'est pas pythonique, une version compatible PEP8 serait TeamMember