Django Multi-Table Inheritance VS Explizite Angabe OneToOne-Beziehung in den Modellen

Hoffe das macht Sinn 🙂 werde ich klären, über Kommentare, falls nötig. Ich bin auch Experimentieren mit fettgedruckter text in dieser Frage, und wird es Bearbeiten, wenn ich (oder du) es als störend empfinden. Mit diesem aus dem Weg...

Mit django.contrib.auth gibt uns Benutzer und Gruppe, unter andere nützliche Dinge, die ich nicht machen kann, ohne (wie basic messaging).

In meiner app habe ich mehrere verschiedene Typen von Benutzern. Ein Benutzer kann nur einen geben. Das wäre leicht behandelt werden, indem Sie Gruppen, mit ein wenig extra-Pflege. Jedoch, diese verschiedenen Benutzer sind in Bezug auf einander in Hierarchien /Beziehungen.

Lassen Sie uns nehmen einen Blick an diesen Benutzer: -

Prinzipien - "top-level-Benutzer

Administratoren - jeder administrator meldet ein AUFTRAGGEBER

- Koordinatoren der einzelnen Koordinator berichtet an den Administrator

Abgesehen von diesen gibt es andere Benutzer gibt, die nicht direkt mit, kann aber für ähnliche, später. Zum Beispiel, "die Firma" ist eine andere Art von Benutzer, und kann verschiedene "Produkte", und Produkte können überwacht werden durch einen "Koordinator". "Käufer" ist eine andere Art von Benutzer kann Produkte kaufen.

Nun alle diese Benutzer haben verschiedene andere Attribute, von denen einige gemeinsam sind, alle Arten von Benutzern und einige von denen unterscheiden, die nur einem Benutzer geben. Zum Beispiel, alle Arten von Benutzern haben eine Adresse. Auf der anderen Seite, nur die Wichtigsten Benutzer gehört zu einer "BranchOffice".

Weiterer Punkt, der bereits oben angeführt, ist, dass ein Benutzer kann immer nur von einem Typ.

Die app auch Bedürfnisse zu verfolgen, erstellt und/oder modifiziert, Schulleiter, Administratoren, Koordinatoren, Unternehmen, Produkte etc.. (So dass zwei weitere links zu dem Benutzer-Modell.)

In diesem Szenario, ist es eine gute Idee, Django ' s multi-table inheritance wie folgt: -

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")
    #
    #
    #

Oder sollte ich gehen, es zu tun mögen dieses: -

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")
    #
    #
    #

Bitte beachten Sie, dass es andere Benutzer gibt, die über foreign keys, zum Beispiel: -

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")

Ich mir bewusst bin, dass Django nicht eine eins-zu-eins-Beziehung für multi-table inheritance hinter die kulissen. Ich bin einfach nicht qualifiziert genug zu entscheiden, was einem mehr sound Ansatz.

InformationsquelleAutor chefsmart | 2009-11-25
Schreibe einen Kommentar