Ich erzeuge eine DocType
Klasse zum Erstellen von Mappings und Speichern von Dokumenten basierend auf meinem ORM.Dynamisch generierter DocType in Elasticsearch DSL
def get_doc_type(self):
attributes = {}
...
# Build attributes dictionary here
DT = type('DocType', (DocType,), attributes)
return DT
Dies scheint funktioniert gut und ich habe keine Probleme mit der Zuordnung. Mein Problem ist, wenn ich versuche, Dokumente zu speichern.
dies nicht funktioniert
Doc = get_doc_type()
for instance in queryset:
doc = Doc()
for field_name in fields:
attribute = getattr(instance, field_name, None)
setattr(doc, field_name, attribute)
doc.save(index)
Wenn dies geschieht, wird ein Dokument tut gerettet werden, aber keiner meiner Attribute gesetzt. Es ist nur ein leeres Dokument.
Ich habe den Code überprüft, um zu bestätigen, dass die field_name
und die Werte enthalten, die ich erwarten würde.
Das funktioniert
Doc = self.get_doc_type()
for instance in queryset:
kwargs = {}
for field_name in fields:
attribute = getattr(instance, field_name, None)
kwargs.update({field_name: attribute})
doc = Doc(**kwargs)
doc.save(index=index)
Wenn ich diese Strategie, das Dokument gespeichert wird, wie erwartet, und alle Informationen und attributes
haben von meinem instance
in die doc
verabschiedet.
FRAGE
Was dies verursachen könnte? Es macht für mich keinen Sinn, warum beide Strategien nicht gültig sind.
Das ist im Grunde, was ich getan habe. Ich habe einen Modellmanager als eine Unterklasse des Django-Managers gemacht (wo meine Methode, die die Klasse generiert, ist). Ich wollte vermeiden, dass ich für jedes Modell eine neue Klasse erstellen musste, und stattdessen einfach mein Mixin hinzufügen. Wenn Sie 'type' NICHT verwenden, um eine Klasse zu generieren, scheint es zu funktionieren. –