Как я должен иметь дело с круговым импортом в Google App Engine?

Если у меня есть "a.py"

from google.appengine.ext import db
class A(db.Model):
    db.ReferenceProperty(b.B)
    ...other stuff

и другой файл "b.py"

from google.appengine.ext import db
class B(db.Model):
    db.ReferenceProperty(a.A)
    ...other stuff

Казалось бы, что Python просто не позволяет круговые зависимости. Обычно я предполагаю, что Вы изменили бы код, таким образом, что эти два класса на самом деле могут разрешить себя, не импортируя друг друга непосредственно. Возможно, путем консолидации их ссылки друг на друга через третьего посредника? Но я не могу только использовать нормальный посреднический класс, поскольку все классы должны были бы в конечном счете быть сохранены к базе данных? Там какое-либо правильное решение к структурированию вышеупомянутого кода, таким образом, что это работает?

У меня есть чувство, что я собираюсь получить много "плохого кода обоняния", "разъединитесь", "плохой дизайн", и т.д. комментирует. Таким образом, я прошу, чтобы, если Вы говорите, что, проиллюстрируйте то, что Вы сделали бы с фактическим примером. Есть ли какие-либо решения, которые включили бы отъезд ссылок, классов и модулей, поскольку они стоят?

Спасибо.

9
задан Stephen Cagle 15 December 2009 в 22:29
поделиться

3 ответа

Обходной путь состоит в том, чтобы иметь ReferenceProperty по крайней мере в одной из моделей, которая не ограничивает себя конкретным классом, а затем принудительно ссылаться только на этот класс в вашем собственном коде.

например,

class A(db.Model):
  b = db.ReferenceProperty()

class B(db.Model):
  a = db.ReferenceProperty(A)

Вы сможете назначить любой экземпляр модели переменной b; только убедитесь, что вы назначаете только действительные B.

7
ответ дан 4 December 2019 в 21:50
поделиться

Что произойдет, если вы определите обе модели в одном модуле? например, a_b.py

1
ответ дан 4 December 2019 в 21:50
поделиться

Согласно документации :

ReferenceProperty имеет еще одно удобное средство особенность: обратные ссылки. Когда модель имеет ReferenceProperty к другому модели, каждая ссылка на объект получает свойство, значением которого является запрос, возвращает все сущности первая модель, которая ссылается на него.

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

1
ответ дан 4 December 2019 в 21:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: