2016-08-03 5 views
0

Hintergrund kombiniert:stellen eine django-Modell, das Daten aus zwei anderen Modellen

ich kratzen Daten aus zwei Quellen zu den kommenden Immobilien zum Verkauf, nennen wir ein SaleAnnouncement, und die andere SellerMaintainedData. Sie teilen viele der gleichen Feldnamen (obwohl einige Daten nur in einer und nicht in der anderen gefunden werden können). Wenn ein Artikel zum Verkauf steht, gibt es garantiert eine SaleAnnouncement, aber nicht unbedingt SellerMaintainedData. Tatsächlich unterhalten nur etwa 10% der "Verkäufer" eine eigene Website mit relevanten Daten. Aber diejenigen, die dies tun, haben immer mehr Informationen und Daten sind aktueller als die Daten in der Ankündigung. Außerdem ist die "Ankündigung" ein Freiformtext, der mehrere Verarbeitungsschritte durchlaufen muss, bevor die relevanten Daten extrahiert werden, und das Modell hat daher einige Felder zum Speichern von Daten in Zwischenschritten der Verarbeitung (ein Teil des Grundes, warum ich mich für 2 entschieden habe Modelle, anstatt sie in 1) zu kombinieren, während die "Verkäufer" -Daten in einem übersichtlichen Tabellenformat abgekratzt werden.

Problem:

Ich würde letztlich sie in eine SaleItem verbinden möchten und haben ein Modell implementiert, die zu den vorherigen zwei Modelle verwandt ist und stützt sich stark auf Eigenschaften zu priorisieren, welches Modell die Daten kommen. Etwas wie:

@property 
def sale_datetime(self): 
    if self.sellermaintaineddata and self.sellermaintaineddata.sale_datetime: 
     return self.trusteeinfo.sale_datetime 
    else: 
     return self.latest_announcement and self.latest_announcement.sale_datetime 

aber ich werde offensichtlich nicht in der Lage sein, diese Felder abzufragen, die mein Endziel sein würden, wenn kommende Verkäufe auflistet. Mir wurde eine Lösung vorgeschlagen, bei der ein benutzerdefinierter Manager erstellt wird, der die Filter-/Ausschlussmethoden außer Kraft setzt. Das klingt vielversprechend, aber ich müsste alle Eigenschaftsfeldlogik im Modellmanager duplizieren.

Zusammenfassung (für Klarheit)

ich habe:

class SourceA(Model): 
    sale_datetime = ... 
    address = ... 
    parcel_number = ... 
    # other attrs... 

class SourceB(Model): 
    sale_datetime = ... 
    address = ... 
    # no parcel number here 
    # other attrs... 

Ich möchte:

class Combined(Model): 
    sale_datetime = # from sourceB if sourceB else from sourceA 
    ... 

ich ein einheitliches Modell wollen, wo gemeinsame Felder zwischen SourceA und SourceB priorisiert werden, so Wenn SourceB existiert, leitet es den Wert dieses Feldes vonaboder sonst kommt es von SourceA. Ich möchte auch die Felder abfragen so vielleicht Eigenschaften mit Hilfe ist nicht der beste Weg ...

Frage

Gibt es eine bessere Art und Weise, sollte ich meine Modelle betrachten Umstrukturierung (möglicherweise jene 2 kombiniert), Oder ist die Custom Manager-Lösung der richtige Weg?

Antwort

0

Ich würde eine andere Lösung vorschlagen. Was ist mit der Verwendung der Vererbung? Sie könnten eine Basisklasse erstellen, die abstrakt wäre (https://docs.djangoproject.com/en/1.9/topics/db/models/#abstract-base-classes). Sie können alle allgemeinen Felder dort platzieren und dann ein separates Modell für SaleAnnouncement und SellerMaintainedData erstellen. Da beide von Ihrem Basismodell erben werden, müssen Sie nur für das bestimmte Modell spezifische Felder definieren.

+0

Während dies das Problem des wiederholten Codes in Form von gemeinsamen Feldern zu lösen scheint, löst es nicht das größere Problem der Verknüpfung der Elemente, um ein "SaleItem" zu repräsentieren, was es mir erlaubt, sie als ein einheitliches Modell abzufragen .Wenn überhaupt, würde das contenttypes-Framework besser geeignet sein als eine abstrakte Basisklasse, aber selbst das scheint die Vereinigung nicht anzusprechen, die ich suche. –

+0

Es tut mir wirklich leid, ich muss deine Frage missverstanden haben. Ich würde mit Custom-Manager-Ansatz gehen. Vielleicht etwas wie dieses http://stackoverflow.com/questions/17968501/single-custom-manager-for-multiple-models-in-django? – mateuszb

Verwandte Themen