Qual è il modo corretto di creare un elenco di diversi modelli leggermente diversi?

3

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:

  1. 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.
  2. 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.

    
posta Tablesalt 06.11.2017 - 12:21
fonte

3 risposte

1

Presumibilmente potresti avere un post che ha un'immagine E testo?

Sospetto che un modo migliore per strutturare le cose sia invece di sottoclassi, pensateci come post che HA un'immagine, o testo HAS.

Sembra una buona applicazione del pattern del componente

link -componente-sistema

    
risposta data 03.10.2018 - 07:50
fonte
1

Potresti memorizzare il post in una sorta di modulo serializzato, diciamo json, che puoi creare serializzando le sottoclassi.

Questa può essere una proprietà o un metodo della classe base implementata lì o sovrascritta nelle sottoclassi, quindi l'elenco funzionerà. Non conosco Django per dirti di più ma hai un'idea generale.

Json sarà anche meglio inviare al client per fare il resto.

Un altro modo potrebbe essere quello di archiviare le informazioni di sottoclassi e trasmettere ogni record al tipo appropriato se questo si applica a Django.

    
risposta data 06.11.2017 - 15:50
fonte
1

Puoi utilizzare Casting per trasmettere l'oggetto Post generico in uno specifico TextPost o ImagePost. Non ho familiarità con Python, ma sembra che questo è come si fa Casting

p = (TextPost)MyPostInstance

A questo punto la variabile p è di tipo TextPost e esporrà tutto l'attributo di quel tipo.

Per prima cosa è necessario assicurarsi che myPostInstance sia del tipo in cui si desidera eseguire il cast. Qualcosa del genere:

if type(myPostInstance) is TextPost:
    p = (TextPost)MyPostInstance

Spero che questo aiuti.

    
risposta data 02.12.2018 - 14:08
fonte

Leggi altre domande sui tag