2010-12-30 18 views
5

Angenommen, Sie haben eine Anwendung, in der verschiedene Arten von Benutzern signieren können: Firmen, Anwälte und Kunden. Eine Firma hat viele Anwälte; Ein Anwalt hat viele Kunden. Die Ansichten für einen festen Benutzer unterscheiden sich natürlich von den Ansichten eines Rechtsanwaltsanwenders; Die beiden unterscheiden sich vom Client-Benutzer.Modellierung von Konten für verschiedene Arten von Benutzern in Django

Wie würden Sie die drei verschiedenen Benutzer modellieren? Ich kann den folgenden Ansatz denken:

Drei verschiedene Modelle mit einem ForeignKey zu User, jede mit ihren eigenen Feldern, zum Beispiel:

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) 

Jetzt können Sie erstellen zum Beispiel Konsultationen als eigenständiges Modell mit zwei ForeignKeys: bis Lawyer und Client; Sie können auch Ressourcen zu einer Beratung hinzufügen (wie Dokumente oder ähnliches), indem Sie ein Modell Resource mit einer ForeignKey bis Consultation erstellen.

Dieser Ansatz macht es schwierig, unter den Nutzern zu unterscheiden: Wie Sie wissen, ob ein user sind ein Firm, zum Beispiel - Sie die Datenbank mehrmals abgefragt werden müssen oder ein Profile den Ober User Objekt zuordnen.

Sie auch nur ein Profile zum User hinzufügen könnte und umfassen eine Role, und dann leiten Sie die Ansichten und Authentifizierung basierend auf user.get_profile().role.

Wie würden Sie mit diesem Problem umgehen?

Antwort

5

Ich würde tun, was Sie vorschlagen hier:

Sie auch nur ein Profil für den Benutzer hinzufügen könnte und umfassen eine Rolle, und dann leiten Sie die Ansichten und Authentifizierung basierend auf user.get_profile() Rolle. .

Erstellen Sie ein Profil mit einem Auswahlfeld für die Rolle. Erstellen Sie einige Dekoratoren wie @lawyer_only, die sicherstellen, dass Ihre Ansichten nur von Anwaltsrollenbenutzern zugänglich sind.

+0

Ja, ich denke, ich muss damit gehen. Vielen Dank! (Gute Idee über die Dekorateure) – Escualo

0

könnten Sie auch prüfen, Subklassen das User-Modell (Modell Vererbung): http://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance

Sie werden mit der Option der Vererbung Multi-Table http://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance seit der User-Klasse ist kein abstraktes Modell muss gehen.

+0

Dies ist nur eine Syntax Zucker für OneToOne Relationen. Ich sehe keinen Vorteil gegenüber dem expliziten OneToOne. –

+0

@Mike: Nicht genau. Wenn ich OO-Software entwerfe, denke ich lieber an das Objektmodell als mein Hauptanliegen (Datenspeicherung kommt später). Wenn also ein Anwalt ein Benutzer ist, möchte ich diese "ist eine" -Beziehung in meinem Code explizit machen, so dass eine Rechtsanwaltsinstanz überall dort verwendet werden kann, wo eine Benutzerinstanz erwartet wird. Übrigens modellieren ORMs die Vererbung und die einzelne Komposition auf die gleiche Weise (als Eins-zu-Eins-Beziehung). Das heißt, Djangos Modellvererbung hat einige Macken, die es nicht genau als Objektvererbung funktionieren lassen. –

Verwandte Themen