2010-12-30 14 views
5

Si supponga di avere un'applicazione in cui diversi tipi di utenti possono firmare: aziende, avvocati e clienti. Una ditta ha molti avvocati; un avvocato ha molti clienti. Le opinioni per un utente fisso sono, ovviamente, diverse dalle opinioni di un utente avvocato; i due sono diversi da quelli dell'utente.Modellazione di account per diversi tipi di utenti in Django

Come modellerebbero i tre diversi utenti? Mi viene in mente il seguente approccio:

Tre modelli differenti con un ForeignKey a User, ognuno con i propri campi, come ad esempio:

class Firm(models.Model): 
user = models.ForeignKey(User) 
class Lawyer(models.Model): 
user = models.ForeignKey(User) 
specialty = models.CharField(max_length=100) 
class Client(models.Model) 
user = modelsForeignKey(User) 

Ora è possibile creare, per esempio, le consultazioni come un modello separato utilizzando due ForeignKeys: a Lawyer e a Client; puoi anche aggiungere risorse a una consultazione (come documenti o cose del genere) creando un modello Resource con un ForeignKey a Consultation.

Questo approccio rende difficile distinguere tra gli utenti: come fai a sapere se un user è un Firm, per esempio - è necessario interrogare il database più volte o assegnare un Profile al User oggetto generico.

Si potrebbe anche aggiungere solo Profile al User e includono un Role, e poi trasmettere le opinioni e l'autenticazione basata su user.get_profile().role.

Come affronteresti questo problema?

risposta

5

vorrei fare quello che suggeriscono qui:

Si potrebbe anche aggiungere solo un profilo per l'utente e comprendono un ruolo, e poi incanalare la vista e l'autenticazione basata su user.get_profile() ruolo. .

Creare un profilo con un campo di scelta per il ruolo. Crea alcuni decoratori come @lawyer_only che assicurano che i tuoi punti di vista siano accessibili solo dagli utenti di ruolo degli avvocati.

+0

Sì, penso che dovrò andare con questo. Grazie! (Buona idea dei decoratori) – Escualo

0

Si potrebbe anche considerare sottoclasse il modello utente (modello di ereditarietà): http://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance

Si dovrà andare con la possibilità di multi-tavolo eredità http://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance poiché la classe utente non è un modello astratto.

+0

Questo è solo uno zucchero sintassi per le relazioni OneToOne. Non vedo alcun vantaggio rispetto a OneToOne. –

+0

@Mike: non esattamente. Quando progetto il software OO, preferisco pensare in termini di modello oggetto come la mia preoccupazione principale (la memorizzazione dei dati viene in seguito). Pertanto, se un avvocato è un utente, preferirei rendere questa relazione "è una" esplicita nel mio codice, in modo che possa utilizzare un'istanza di avvocato ovunque sia prevista un'istanza utente. Per inciso, l'ORM modella l'ereditarietà e la composizione singola allo stesso modo (come una relazione uno a uno). Detto questo, l'ereditarietà del modello di Django ha alcune stranezze che lo rendono non funziona esattamente come l'ereditarietà degli oggetti. –

Problemi correlati