Spero che tutto ciò abbia senso :) Se necessario, chiarirò tramite i commenti. Inoltre, sto sperimentando usando il testo in grassetto in questa domanda, e lo modificherò se io (o voi) lo troviate fonte di distrazione. Con questo fuori strada ...Django Multi-Table Inheritance VS Specifica esplicita relazione OneToOne nei modelli
Utilizzando django.contrib.auth ci fornisce Utente e Gruppo, tra le altre cose utili di cui non posso fare a meno (come la messaggistica di base).
Nella mia app ho diversi tipi di utenti. Un utente può essere di un solo tipo. Questo sarebbe facilmente gestito dai gruppi, con un po 'di attenzione in più. Tuttavia, questi diversi utenti sono correlati l'uno all'altro nelle gerarchie/relazioni.
Diamo uno sguardo a questi utenti: -
presidi - utenti "alto livello"
amministratori - ogni amministratore riferisce a un'entità
coordinatori - ciascun coordinatore riferisce a un amministratore
Oltre a questi ci sono altri tipi di utenti che non sono correlati direttamente, ma potrebbero essere correlati in seguito. Ad esempio, "Azienda" è un altro tipo di utente e può avere vari "Prodotti" e i prodotti possono essere supervisionati da un "Coordinatore". "Acquirente" è un altro tipo di utente che può acquistare prodotti.
Ora tutti questi utenti di hanno vari altri attributi, alcuni dei quali sono comuni a tutti i tipi di utenti e alcuni sono distinti solo da un tipo di utente. Ad esempio, tutti i tipi di utenti devono avere un indirizzo. D'altra parte, solo l'utente principale appartiene a un "BranchOffice".
Un altro punto, che è stato affermato sopra, è che un utente può essere sempre di un solo tipo.
L'app anche deve tenere traccia di chi ha creato e/o modificato Principali, Amministratori, Coordinatori, Aziende, Prodotti ecc.. (Ecco, questo è più di due collegamenti al modello User.)
In questo scenario, è una buona idea usare multi-tavolo l'eredità di Django come segue: -
from django.contrib.auth.models import User
class Principal(User):
#
#
#
branchoffice = models.ForeignKey(BranchOffice)
landline = models.CharField(blank=True, max_length=20)
mobile = models.CharField(blank=True, max_length=20)
created_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalcreator")
modified_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalmodifier")
#
#
#
O devo andare a farlo in questo modo: -
class Principal(models.Model):
#
#
#
user = models.OneToOneField(User, blank=True)
branchoffice = models.ForeignKey(BranchOffice)
landline = models.CharField(blank=True, max_length=20)
mobile = models.CharField(blank=True, max_length=20)
created_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalcreator")
modified_by = models.ForeignKey(User, editable=False, blank=True, related_name="principalmodifier")
#
#
#
si prega di tenere a mente che ci sono altri tipi di utenti che sono collegati tramite chiavi esterne, ad esempio: -
class Administrator(models.Model):
#
#
#
principal = models.ForeignKey(Principal, help_text="The supervising principal for this Administrator")
user = models.OneToOneField(User, blank=True)
province = models.ForeignKey( Province)
landline = models.CharField(blank=True, max_length=20)
mobile = models.CharField(blank=True, max_length=20)
created_by = models.ForeignKey(User, editable=False, blank=True, related_name="administratorcreator")
modified_by = models.ForeignKey(User, editable=False, blank=True, related_name="administratormodifier")
Sono consapevole del fatto che Django utilizza una relazione uno a uno per l'ereditarietà multi-tavolo dietro le quinte. Non sono abbastanza qualificato per decidere quale sia un approccio più sano.
Mi sembra una buona implementazione. Ma perché hanno sia la classe UserProfile sia la classe PositionHolderUserProfile? Non sarà più semplice sbarazzarsi di quest'ultimo e spingere tutto in esso al modello precedente? – chefsmart
Ho pensato che fosse meglio incapsulare i dati relativi a tutti i detentori di posizione, ad es. Principale, Amministratore e Coordinatore, ma non rilevante per altri utenti come Acquirente e Azienda. Tali dati potrebbero includere in quale ramo lavorano, quanto tempo sono stati impiegati, ecc. – taleinat
Questo non sembra funzionare con le impostazioni.AUTH_PROFILE_MODULE. –