2016-12-20 4 views
0

Ich habe eine Python/Flask-App, die MongoEngine für die Datenbank verwendet. Ich habe meine Modelle definiert, und alles funktionierte, bis die neuesten Modelle hinzugefügt wurden. Ich glaube, das Problem tritt auf, weil beide Modelle sich gegenseitig referenzieren und eine rekursive Importschleife verursachen. Ich bin mir nicht sicher, was ich tun soll, um es zu lösen. Dies wird ein großes Projekt mit vielen Modellen sein, die sich gegenseitig referenzieren. Diese bestimmte Instanz ist, weil Benutzer in Praxen sind und Praxen Benutzer haben, also ist es eine Beziehung von vielen zu vielen.Python rekursive Import Problem

Benutzermodell

from utilities.common import utc_now_ts as now 
from mongoengine import * 
from models.practice import Practice 

class User(Document): 
    name = StringField() 
    created = IntField(db_field="cr", default=now) 
    practices = ListField(ReferenceField(Practice)) 

Und die Praxis Modell

from utilities.common import utc_now_ts as now 
from mongoengine import * 
from models import user 

class Practice(Document): 
    name = StringField() 
    created = IntField(db_field="cr", default=now) 
    users = ListField(ReferenceField(user.User)) 
    admins = ListField(ReferenceField(user.User)) 

Der Fehler, den ich bekommen ist ImportError: cannot import name 'Practice'

ich zwei weitere Modelle haben, die in das gleiche Problem laufen. Die Modelle funktionierten gut, bis ich die Importe zu dem anderen Modell hinzufügte.

+0

Gibt es einen Grund, dass sie rekursiv referenziert werden? Der beste Weg, um dieses Problem zu lösen, ist wahrscheinlich ein Modell-Refactor, um eine der Abhängigkeiten zu entfernen. –

+0

Können Sie mir zeigen, wie ich es ändern kann? Ich brauche eine Liste von Benutzern für jedes Modell, und ich brauche eine Liste von Gruppen für jeden Benutzer. Dies war die Methode, die Leute empfohlen haben, als ich nach dem Thema gesucht habe. – Jhorra

Antwort

2

Ich bin keineswegs ein Experte für MongoEngine, aber es sieht so aus, als ob Sie ein Modell nach String und nicht nach Klasse referenzieren können. In diesem Fall können Sie Ihr Practice Modell so ändern, dass es so aussieht.

from utilities.common import utc_now_ts as now 
from mongoengine import * 


class Practice(Document): 
    name = StringField() 
    created = IntField(db_field="cr", default=now) 
    users = ListField(ReferenceField('User')) 
    admins = ListField(ReferenceField('User')) 

Ich hoffe, das hilft.

2

Die kurze Antwort ist, dass Sie keine Zirkelverweise haben können. Der Compiler vertraut nicht darauf, dass Sie beim Auflösen von Referenzen richtig "durchbohren", und es wird nicht durch den Graphen iterieren, um es herauszufinden.

Eine Möglichkeit, dies zu beheben, ist die Verwendung einer Master-Klasse, die die verschiedenen Klassen importiert; Ihre Worker-Klassen importieren dann ihre Bedürfnisse von der Master-Klasse.

+0

Angenommen, das wären meine einzigen zwei Klassen, könnten Sie mir ein Beispiel dafür geben, wie die Meisterklasse aussehen würde. – Jhorra

+1

Versuchen Sie die Diskussion [hier] (http://stackoverflow.com/questions/1556387/circular-import-dependency-in-python) – Prune