Frage

Ich arbeite an einem Web-Service in Django, und ich brauche eine sehr spezifische, komplexe Beziehung zu modellieren, die ich einfach nicht in der Lage sein, zu lösen.

Stellen Sie sich drei allgemeine Modelle, nennen wir sie Standort, Kategorie und Artikel. Jede Website enthält eine oder mehr Kategorien, aber es kann in einem von zwei möglichen Wegen auf sie bezieht: eine „gemeinsame“ Kategorien sind, die in einer many-to-many-Beziehung sind: sie sind vordefiniert, und jeder Standort auf Null beziehen oder mehrer der Kategorien, und vice versa. Die andere Art von Kategorien sind individuell für jeden Standort definiert, und eine solche Kategorie „gehört“ nur an dieser Stelle und keine andere; das heißt, sie sind in einer Viele-zu-Eins-Beziehung, da jede Website eine Reihe von diesen Kategorien haben.

Intern sind die zwei Arten von Kategorien völlig identisch, sie unterscheiden sich nur in der Art, wie sie auf den Seiten verbunden sind. Es könnte aber sie in zwei verschiedenen Modellen trennt (mit einem gemeinsamen Muttermodell wahrscheinlich), aber das löst nur die Hälfte meines Problems: das Einzelteilmodell in einer Viele-zu-Eins-Beziehung mit den Kategorien, dh jeder Punkt gehört zur nur eine Kategorie, und im Idealfall sollte es nicht egal, wie es zu einer Site verknüpft ist.

Eine andere Lösung wäre, die zwei getrennte Arten von Site-Kategorie Beziehungen zu ermöglichen, zu koexistieren (dh sowohl eine ForeignKey und ein ManyToMany Feld auf der gleichen Kategorie Modell zu haben), aber diese Lösung fühlt sich an wie eine ganz andere Dose Würmer öffnen .

Hat jemand eine Idee haben, wenn es eine dritte, eine bessere Lösung zu dieser Sackgasse?

War es hilfreich?

Lösung

Warum haben nicht nur beide Arten der Kategorie in einem Modell, so dass Sie nur drei Modelle haben?

Site

Category
  Sites = models.ManyToManyField(Site)
  IsCommon =   models.BooleanField()

Item
  Category = models.ForeignKey(Category)

sagen Sie „Intern die zwei Arten von Kategorien völlig identisch sind“. So in klingt wie dies möglich ist. Beachten Sie es perfekt ist gültig für eine ManyToManyField nur einen Wert zu haben, so dass Sie nicht brauchen „ForeignKey und ein ManyToMany Feld auf der gleichen Kategorie Modell“, das nur wie ein Streit klingt. Nur nur einen Wert im ManyToMany Feld setzen

Andere Tipps

Wie als alternative Implementierung Sie django Inhaltstypen (generische Beziehungen) nutzen, um die Verbindung der Elemente zu erreichen. Ein Bonus diese Implementierung für die Nutzung ist, dass es erlaubt Ihnen, die Kategorie Modelle auf unterschiedliche Weise zu nutzen Ihre Daten in Abhängigkeit der Straße muss nach unten.

Sie können machen die Website-Kategorien mit einfacher nach Modell Methoden zu schreiben für das Ziehen und Sortierkategorien. Djangos contrib Admin unterstützt auch die generische Beziehung inlines.

Ihre Modelle wie folgt sein würde:

Site(models.Model):
  label = models.CharField(max_length=255)

Category(models.Model):
  site = models.ManyToManyField(Site)
  label = models.CharField(max_length=255)

SiteCategory(models.Model):
  site = models.ForeignKey(Site)
  label = models.CharField(max_length=255)

Item(models.Model):
  label = models.CharField(max_length=255)
  content_type = models.ForeignKey(ContentType)
  object_id = models.PositiveIntegerField()
  content_object = generic.GenericForeignKey('content_type', 'object_id')

Für eine gründliche Überprüfung von Inhaltstypen und wie die allgemeinen Beziehungen zur Abfrage können Sie hier lesen: http: // docs. djangoproject.com/en/dev/ref/contrib/contenttypes/

Vorab: Ich weiß, Object-Relation Mapping, Rails und Python, aber nicht speziell Django

.

Ich sehe zwei additinal Optionen:

  1. aus einer Datenbank Sicht denkt, konnte ich die Tabelle für die viel viel Beziehung halte ein zusätzliches Feld erforderlich machen, die eine „gemeinsame“ vs. „site“ Beziehung gibt und füge Einschränkungen die Art der „site“ zu begrenzen, Beziehungen. Dies kann in Django getan werden, glaube ich, im Abschnitt "Extras Felder auf Many-to-many-Beziehungen."

Wenn Sie in einer früheren Version von Django sind, können Sie immer noch das tun, indem Sie die vielviel Tabelle ein explict Modell zu machen.

  1. Denken von einem Objekt Sicht kann ich die Kategorien in drei Klassen sehe Aufteilung:

    BaseCategory

    CommonCategory (BaseCategory)

    SiteCategory (BaseCategory)

und dann eine Vererbungsmodell Django verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top