2017-08-17 2 views
1

Ich bin mir nicht sicher über die "richtige" Methode, die Beziehung zwischen zwei eng verwandten, hierarchiebasierten Objekten zu definieren.Django-Modellvererbung für eng verwandte Objekte

Ich entwickle eine Art Forum-wie Framework in Django.

Meine ursprüngliche Idee war, dass, da ein Thread im Grunde eine "spezielle" Art von Post ist, ich einfach ein voll funktionsfähiges Post-Modell erstellen und dann ein Thread-Modell davon erben soll, erweitert mit beliebigen Feldern ein Thread Könnte gebrauchen. Wie so:

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() 
    (...) 

Ich dachte auch, ein einziges „Post“ Modell mit einem „isThread“ boolean Feld zu machen, sondern etwas nicht richtig fühlte darüber.

Ich habe in der Django docs ein Beispiel gesehen, das sehr verwandt scheint, aber es heißt, dass die Objekte in separaten Tabellen gespeichert sind, und ich bin mir nicht sicher, ob das die beste Wahl für diese Art von Design ist.

Was wäre der "richtige" Weg, um dies zu erreichen, in Bezug auf die Leistung und in der Praxis?

+0

Das hängt davon ab, ob Sie Post-Objekte in Ihrer Datenbank speichern. Wenn du sowohl "Posts" als auch "Threads" hast, dann machst du das Richtige. Wenn nicht, und Sie denken, dass Sie in der Zukunft möglicherweise andere Arten von Posts haben, möchten Sie vielleicht 'Post' zu einer [abstrakten Basisklasse] machen (https://docs.djangoproject.com/en/1.11/topics/db/models/# abstract-base-classes), die unterklassiert werden müssen. Etwas wie 'is_thread' zu verwenden ist nicht optimal, da dies bedeutet, dass die spezifischen' Thread'-Felder optional sein müssen und Sie alle Validierungen schreiben müssen, anstatt sich auf die Modellvalidierung zu verlassen. – dirkgroten

Antwort

0

Es hängt von Ihren Definitionen ab.

Was ist der Unterschied zwischen einem Thread und einem Post - ist ein Thread nur ein Post mit Antworten? oder muss ein Post zu einem Thread gehören?

Für mich, ich würde sagen, dass ein Post in Antwort auf eine andere Post sein könnte, so könnte ein Nullable-reply_toFK('self') Feld benötigen.

Auf diese Weise könnten Sie eine einzige Post mit vielen Antworten haben, wodurch ein Thread erstellt wird und Sie Antworten auf Antworten zulassen können (oder nicht, je nach Anwendungsfall).

Zum Speichern von Ansichtszählwerten usw. können Sie diese in einer Art Zeitreihe speichern (auf diese Weise können Sie wissen, wie beliebt ein Beitrag im Laufe der Zeit ist und nicht nur eine ganze Zahl) eine einfache Zählung Operation, um Gesamtansichten für Beispiel zu bekommen)

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

Viele Möglichkeiten, es zu tun!

+0

Sie haben Recht, ich hätte genauer sein sollen. Ein 'Thread' ist in der Tat nur ein' Post' mit Antworten. Eine 'Post' kann eine Antwort auf eine andere' Post' sein, solange beide 'Post's zum selben' Thread' gehören. – Man

+0

In diesem Fall gibt es keine echten gemeinsamen Felder zwischen einem 'Thread' und einem' Post' und Sie sollten nur zwei separate Modellklassen und eine FK-Beziehung zwischen einem 'Post' und einem' Thread' haben –

Verwandte Themen