2017-08-17 64 views
1

我不確定定義兩個緊密相關的基於層次結構的對象之間關係的「正確」方法。關係密切的對象的Django模型繼承

我在Django開發了一種類似論壇的框架。

我最初的想法是,由於Thread基本上是一種「特殊」類型的Post,所以我應該創建一個功能齊全的Post模型,然後讓Thread模型繼承它,並用任何字段擴展一個Thread可能需要。像這樣:

class Post(models.Model): 
    forum = models.ForeignKey(Forum) 

    title = models.CharField(max_length=50, default="") 
    text = models.CharField(max_length=2000, default="") 

    created = models.DateTimeField(auto_now_add=True) 
    author = models.ForeignKey(User) 

class Thread(Post): 
    thread_views = models.IntegerField() 
    reply_count = models.IntegerField() 
    (...) 

我也想過做一個單一的「郵報」模型與「isThread」布爾字段的事,但感覺不對了。

我在Django docs中看到一個看似非常相關的例子,但它確實表示這些對象存儲在不同的表中,我不確定這是否是這種設計的最佳選擇。

什麼是「正確」的方式來做到這一點,表現明智和良好做法明智?

+0

這取決於你是否要將'Post'對象實際保存到數據庫中。如果你將同時擁有'Posts'和'Threads',那麼你做的是正確的事情。如果不是,並且您認爲將來可能有其他類型的帖子,那麼您可能希望將「Post」作爲[抽象基類](https://docs.djangoproject.com/en/1.11/topics/db/models /#abstract-base-classes)需要被子類化。使用'is_thread'這樣的東西並不是最優的,因爲這意味着特定的'Thread'字段必須是可選的,你需要編寫所有的驗證,而不是依靠模型驗證。 – dirkgroten

回答

0

這取決於你的定義。

ThreadPost之間有什麼區別 - 是Thread只是Post回覆?或者Post必須屬於Thread

對於我來說,我會說,一個Post可能是在回答另一Post,所以可能需要一個可以爲空reply_toFK('self')場。

這樣你可以有一個單獨的Post與許多答覆,從而創建一個線程,並且你可以允許答覆答覆(或不答覆,根據你的用例)。

爲了存儲查看次數等,你可以用某種時間序列的方式存儲它(這樣你就可以知道一篇文章隨着時間的推移而變得多麼受歡迎,而不是一個整數,以及能夠做到一個簡單的計數操作來獲取總視圖)

class PostActions: 
    post (link to Post) 
    action ('view', 'like', 'click' etc) 
    timestamp (auto_now) 

很多方法可以做到這一點!

+0

你說得對,我應該更具體。一個'Thread'實際上就是一個帶有回覆的'Post'。只要'Post'屬於同一個'Thread','Post'可以是對另一個'Post'的回覆。 – Man

+0

在這種情況下,'Thread'和'Post'之間沒有真正的共同字段,你應該只有兩個獨立的模型類和'Post'和'Thread'之間的FK關係 –