2016-05-16 12 views
1

Ich habe das kleine Stück Code unten, um die Objektkurve zu erstellen. Wenn eine neue Kurve erstellt wird, durchläuft sie zuerst die Methode __new__. Es prüft, ob diese Kurve bereits in der Datenbank existiert, und wenn dies der Fall ist, gibt sie diese Kurve zurück. Wenn eine neue Kurve in einer leeren Datenbank erstellt wird, wird erwartungsgemäß None zurückgegeben. Wenn es erstellt wird, während die name bereits existiert, dann wirft es einen Fehler und gibt KeyError: 'name' (nicht wirklich viele Informationen hier ..).query.filter kann kein vollständiges Objekt zurückgeben

class Curve(Base): 

    __tablename__ = 'curve' 
    id = Column(Integer, primary_key = True) 
    name = Column(String, unique = True) 
    type = Column(String) 

    # We override the new method to first check if the object already exists 
    # If it does exist then we return this object 
    def __new__(*cls, **kw): 
     x = base.session.query(Curve).filter(Curve.name==kw["name"]).first() 
     if x: return x 
     return object.__new__(*cls, **kw) 

    def __init__(self, type, name): 
     self.type = type 
     self.name = name 
     self.add(False) 

    def add(self, commit): 
     create(base.session, self, commit, name=self.name) 

Interessanterweise, wenn wir anstatt eine ganze Kurve zurückgeben, nur ein Attribut, z.

x = base.session.query(Curve.name).filter(Curve.name==kw["name"]).first() 

dann funktioniert es ganz gut ...

Irgendwelche Ideen?

+1

Vollständige Stapelverfolgung, bitte. – univerio

+0

Bitte fügen Sie ein minimales, * vollständiges * und überprüfbares Beispiel bei. Wie benutzt du den Kurs? Übergeben Sie Argumente als Positions- oder Schlüsselwortargumente an Konstruktor? Alles in allem würde eine "@ Klassenmethode" meiner Meinung nach eine bessere Fabrik für diese Art von Arbeit darstellen. –

Antwort

0

Können Sie versuchen, Ihre __new__ Methode zu aktualisieren.

def __new__(cls, **kw): 
    x = base.session.query(Curve).filter(Curve.name==kw["name"]).first() 
    if x: return x 
    return super(Curve, cls).__new__(**kw) 
+0

danke für deinen Kommentar. Ich führe den Code in Visual Studio aus, wo der Fehler in python.exe ausgelöst wird. Es heißt immer noch 'KeyError: 'name'' an der Zeile' x = base.session.query (Curve) .filter (Curve.name == kw ["name"]). First() ' –

+0

muss man sich vergewissern dieser "Name" ist in KW vorhanden, dafür müssen Sie beim Anlegen des Objekts explizit ** name ** angeben. ** Kurve (Name = 'etwas') ** – aviator

Verwandte Themen