Sto specificatamente chiedendo di Django qui, ma apprezzerei qualsiasi intuizione.
Attualmente sto scrivendo un social network di base. Il mio piano è di consentire agli utenti di creare diversi tipi di post (cioè messaggi di testo, post di immagini e post di video) e quindi consentire loro di accedere cronologicamente ai post degli altri sul loro feed. Il feed deve contenere tutti questi diversi tipi di post.
Ho pensato che sarebbe stato banale da fare, sottoclassando una classe Post generale in una classe TextPost, una classe ImagePost e così via, quindi semplicemente visualizzando ogni post nel feed.
#What I thought I would do
class Post(models.Model):
user = models.ForeignKey(User, editable = False)
time = models.TimeField(auto_now=True)
class TextPost(Post):
content = models.TextField()
class ImagePost(Post):
image = models.ImageField()
Tuttavia, non sembra che Django sia costruito per gestire questo; quando provo a ottenere un elenco di post, Django restituisce i post senza i campi della sottoclasse, ovvero senza i campi "content" o "image".
Come vedo, ho due scelte:
- Aggiungi altri campi alla classe Post, quindi contiene "contenuto", "immagine", "post", ecc. So che questo è male, poiché significherebbe che molte righe Post sarebbero vuote, non sarebbe t scale per consentire diversi tipi di post e richiederebbe molto più codice per assicurarti che, ad esempio, un singolo post non avesse sia un'immagine che un video.
- Utilizza una soluzione alternativa come questa classe InheritanceManager per fare cosa Voglio, nonostante quello che permette Django. Anche se attualmente sto andando avanti con questa opzione dato che fa quello che voglio fare, ne sono diffidente perché sembra strano che Django non gestisca quello che mi sembra essere un problema comune (trattare modelli di fratelli leggermente diversi allo stesso modo) molto semplicemente, e mi sembra di aver sbagliato qualcosa da qualche parte.
Per dirla in breve, voglio visualizzare tutte queste sottoclassi leggermente diverse dello stesso modello in un elenco e non so come farlo correttamente. So che questa domanda mi sembra un po 'soggettiva, ma, almeno per me, questo problema è che si sente come dovrebbe avere una soluzione ovvia.