2017-01-03 6 views
1

Ich habe eine externe Datenbank, die ich in keiner Weise ändern kann (schreibgeschützt). Es hat drei Tabellen - Company (id), CompanyContact (company_id, contact_id), Contact (id, company_id).Django Union zwei Tabellen in einzelnes Modell

Grundsätzlich hat Contact einen Nullable-Fremdschlüssel zu Company Tisch und es funktioniert so viele-zu-eins, aber wenn company_id null ist, ich habe in CompanyContact Tabelle suchen, die many-to-many Art Beziehung. Wie kann ich diese zwei Tabellen (Contact und CompanyContact) in einem Modell kombinieren? Contact? Mit anderen Worten, wie kann ich alle Kontakte für eine bestimmte Firma bekommen?

In SQL, die so etwas wie sein würde:

select contact.id from contact where company_id = XXX union select contact_id from companycontact where company_id = XXX

Django Modelle:

class Company(models.Model): 
    uuid = models.CharField(max_length=36, primary_key=True, db_column='id') 

    class Meta: 
     managed = False 


class Contact(models.Model): 
    uuid = models.CharField(max_length=36, primary_key=True, db_column='id') 
    company = models.ForeignKey(Company, db_column='company_id') 

    class Meta: 
     managed = False 

Ich habe nicht ein Modell für CompanyContact. Und es gibt nichts in Ansichten zu zeigen, weil das im Grunde ist meine Frage, wie man Kontakte für eine bestimmte Firma bekommt.

+0

können Sie die Tabelle/Spalte mischen in Ihrer Frage klären bitte – e4c5

+0

Zeigen Sie uns die models.py und Blick ?? –

Antwort

0

Die Originaltabellen in Ihrer Datenbank sind nicht richtig strukturiert. Es ist falsch, dass das Kontaktfeld ein Feld company_id haben sollte. Das verkompliziert unnötigerweise alle Abfragen (Raw SQL oder Django), da eine zusätzliche Überprüfung für das Feld contact_id erforderlich ist.

Auf der anderen Seite ist es absolut legitim, dass zwei Entitäten in einer Beziehung viele zu viele genau eine Zuordnung statt vieler haben. Es gibt also keine eindeutige Antwort auf diese Frage. Ich nehme an, deine beste Wette wäre, ein ManyToMany-Feld hinzuzufügen. Ich mache diesen Vorschlag rein auf der Tatsache, dass Sie die Daten sagen ist nur lesen

class Contact(models.Model): 
    uuid = models.CharField(max_length=36, primary_key=True, db_column='id') 
    company = models.ForeignKey(Company, db_column='company_id') 
    companies = models.ManyToManyField(Company, related_name='companies') 


    class Meta: 
     managed = False 
+0

Nicht sicher, ich habe Ihren ersten Absatz über Kontaktfeld mit einem contact_id-Feld verstanden? Die Kontakttabelle hat ein company_id-Feld (was vermutlich auf historische Gründe zurückzuführen ist), aber keine contact_id, und es gibt eine andere Tabelle CompanyContact, die eine Viele-zu-Viele-Beziehung speichert. Auf jeden Fall kann ich dort nichts ändern, also muss ich damit umgehen. –

+0

Entschuldigung, das sollte companion_id korrigiert werden – e4c5

+0

Sie haben Recht, ich habe diese falsch strukturierten Tabellen, aber nichts, was ich tun kann (meine Vermutung, dass sie so eingestellt wurden, rückwärts kompatibel zu sein). Das Hinzufügen eines anderen Modells für die Viele-zu-Viele-Beziehung, das Zuordnen von Spaltennamen scheint mein Problem zu lösen, obwohl ich diese beiden Firmenfelder noch zusammenführen muss. –

Verwandte Themen