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?
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