Ich verwende factory_boy , um Test-Fixtures zu erstellen. Ich habe zwei einfache Fabriken, unterstützt durch SQLAlchemy-Modelle (unten vereinfacht).
Ich möchte AddressFactory.create()
mehrmals aufrufen und ein Country
erstellen lassen, wenn es noch nicht existiert. Anderenfalls möchte ich den vorhandenen Datensatz wiederverwenden.
Meine Frage ist: Wie kann ich diese Fabriken einrichten, so dass factory_boy nicht jedes Mal versucht, ein neues Land zu erstellen, wenn es eine Adresse erstellt?
Sie haben zwar Recht, dass es für SQLAlchemy-basierte Factorys keine get_or_create
-Funktion gibt. Wenn die Objekte, die Sie als Fremdschlüssel verwenden möchten, bereits vorhanden sind, können Sie sie durchlaufen:
Man könnte also eine Lösung in Ihrer Fabrik zusammenhacken, indem Sie ein Lazy-Attribut verwenden, das zuerst prüft, ob das Objekt in der Datenbank existiert, und wenn ja, verwendet es diese Methode, um sie zu durchlaufen, aber wenn das Objekt nicht existiert , ruft sie SubFactory
auf, um das Objekt zuerst zu erstellen.
Eine andere hackige Lösung besteht darin, die Methode create
der Factory so zu überschreiben, dass das Objekt durch Abfragen und Zwischenspeichern der Ergebnisse durchsucht wird.
Dieses einfache Beispiel filtert die **kwargs
though nicht:
Tags und Links python sqlalchemy factory-boy