при сохранении сущности, имеющей ссылочные свойства, отвечает ли приложение за проверку того, что сущности, на которые ссылаются ссылочные свойства, уже существуют в хранилище данных? Во время модульного тестирования с помощью datastore_v3_stub я обнаружил, что механизм приложений с радостью сохранит сущность A, с которой связано эталонное свойство B (а B еще не существует в хранилище данных). далее, когда A сохраняется, B не сохраняется.
Когда вы впоследствии получаете A из хранилища данных и пытаетесь перейти к B, вы получаете исключение.
Это ожидаемое поведение?
Пример кода:
user = MyUser(key_name='2',
name='my user 2')
e = db.get(user.key())
self.assertTrue(e is None) # user does not exist in datastore yet
preferences = Preferences(user=user) # user is a ReferenceProperty
preferences.put()
e = db.get(user.key())
self.assertTrue(e is None) # user still does not exist in datastore
e = db.get(preferences.key())
self.assertFalse(e is None) # but preferences were still stored
e.user will give exception
EDIT: я новичок в Python, но можно ли написать класс, который подклассов db.Model и переопределяет метод put для обеспечения ссылочной целостности (с помощью некоторого отражения) перед вызовом put из db.Model. Затем я могу просто создать подкласс этого класса для обеспечения ссылочной целостности в моих модельных классах (например, A, B выше)
это то, что я придумал. любой гуру может пересмотреть код:
for name, property in obj.properties().items():
if isinstance(property, db.ReferenceProperty):
try:
value = getattr(essay, name)
except datastore_errors.Error:
print name, property, 'does not exist in datastore yet'
continue
key = value.key()
o = db.get(key)
if o is None:
print name, property, value, 'does not exist in datastore yet'