Я пишу некоторые модульные тесты для своего приложения Django в Google App Engine. В тестах используется заглушка хранилища данных, вызывая init_datastore_v3_stub
и сохраняя в нем некоторые тестовые данные. Для простых моделей это прекрасно работает, но когда я храню модель B
, которая является подклассом модели A
, я получаю только результаты, если я запрашиваю модель как A
. Пример кода:GAE Datastore Stub Issue
class A(db.polymodel.PolyModel):
...
class B(A):
....
B().put()
print A.all().count() # prints 1
print B.all().count() # prints 0
Обратите внимание, что в производстве обеих линий напечатает 1. Любые предложения?
Обновление: Похоже, что проблема не связана с самой db, а с реализацией PolyModel. Я заметил, что B._entity
не содержит значение 'class'
, как следует, но вместо этого содержит '_class'
. Он выглядит так:
print B._entity # prints {... '_class'=[u'A', u'B'] ...}
Это объясняет результат, который я получил. Когда я вручную установить значение 'class'
, все работает:
b = B()
b._entity['class'] = b._entity['_class']
b.put()
print B.all().count() # prints 1
Я буду продолжать исследовать и обновлять здесь, когда я найти причину этой проблемы.
Возможно, вы столкнетесь с возможной консистенцией. Вы должны это исключить, прежде чем рассматривать другую проблему. –
Спасибо @TimHoffman за комментарий. Я попробовал добавить 'sleep (10)' перед отпечатками и еще такими же результатами. Что еще я могу сделать, чтобы исключить возможную консистенцию? – Tzach
Получить ключ от объекта, который вы только что положили, а затем вызвать get(), и это позволит устранить возможную согласованность. –