2017-10-20 108 views
0

我對django很陌生。在爲我正在編寫的應用程序編寫模型時,由於我用於單個模型的所有外鍵(我的票模型是特定的),我覺得自己做錯了一些事情。模型中的許多外鍵,更好的模型做法?

我在開始時的想法是我希望每張門票都能保存其創建者的信息,該門票分配的隊伍以及門票上的註釋。和其他不需要外鍵的信息。我做對了嗎?我不知道爲什麼,但我覺得有更好的方法。

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

而且,只是一個提示,[auto_now_add](https://docs.djangoproject.com/en/1.11/ref/models/字段/#django.db.models.DateField)可以幫助你在'Ticket'的'Team_member'和'date_opened'上使用'DateField' /'DateTimeField'。 – Art

+0

只是一個Django提示:查看GenericRelations是否會幫助你的系統。您可以使用GR替換「Ticket.comments」FK。 https://simpleisbetterthancomplex.com/tutorial/2016/10/13/how-to-use-generic-relations.html – White

回答

1

你的問題實際上與Django很少有關係(比如,什麼?)。 請閱讀約database normalization,它應該回答你的問題。

關於你的模型,我可以注意以下幾點:

  • 你的模型看起來相當不錯。不要害怕外鍵,它們是你使用關係數據庫的主要原因:)
  • 我認爲,User可能是Team(服務?)或某人開票的成員。如果是這樣的話:當你有worker外鍵時,你很可能不需要在Ticket模型中需要team。這將是多餘的,因爲worker將與Team有關係。
  • 吹毛求疵:Team_member不是Python的,一個PEP8兼容的版本將是TeamMember