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?
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. –
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