2016-12-20 6 views
0

У меня есть приложение Python/Flask, которое использует MongoEngine для базы данных. Я определил свои модели, и все работало до тех пор, пока не были добавлены новейшие модели. Я считаю, что проблема возникает из-за того, что обе модели ссылаются друг на друга и вызывают рекурсивный цикл импорта. Я не уверен, что делать, чтобы решить это. Это будет большой проект с множеством моделей, ссылающихся друг на друга. Этот конкретный пример заключается в том, что пользователи работают в практике, а практика имеет пользователей, поэтому это отношения многих и многих.Рекурсивная проблема импорта Python

пользователя Модель

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)) 

И модель практика

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)) 

Ошибки я получаю ImportError: cannot import name 'Practice'

У меня есть две модели, которые работают в том же номере. Модели отлично работали до тех пор, пока я не добавил импорт в другую модель.

+0

Есть ли причина, по которой они рекурсивно ссылаются? Лучший способ решить эту проблему, скорее всего, будет модельным рефактором для удаления одной из зависимостей. –

+0

Можете ли вы показать мне, как изменить его? Мне нужно иметь список пользователей для каждой модели, и мне нужно иметь список групп для каждого пользователя. Это был метод, который люди рекомендовали, когда я искал эту тему. – Jhorra

ответ

2

Я никоим образом не специалист по MongoEngine, но похоже, что вы можете ссылаться на модель по строкам, а не по классу. В этом случае вы можете изменить свою модель Practice, чтобы выглядеть так.

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')) 

Надеюсь, это поможет.

2

Короткий ответ заключается в том, что вы не можете иметь круглые ссылки. Компилятор не верит, что вы будете правильно «снижать» при разрешении ссылок, и он не будет проходить через график, чтобы узнать.

Один из способов исправить это - использовать мастер-класс, который импортирует различные классы; ваши рабочие классы затем импортируют свои потребности из мастер-класса.

+0

Предполагая, что это были мои только два класса, вы могли бы привести мне пример того, как будет выглядеть мастер-класс. – Jhorra

+1

Попробуйте обсуждение [здесь] (http://stackoverflow.com/questions/1556387/circular-import-dependency-in-python) – Prune

Смежные вопросы