如何在expando模型之间进行参考?

时间:2012-01-03 10:09:44

标签: google-app-engine google-cloud-datastore webapp2 self-reference app-engine-ndb

更新

这是我尽最大努力创建以下方案 enter image description here

user = self.auth.store.user_model.create_user(email,
        password_raw=newpasswd)
if not user[0]:  # user is a tuple
    return user[1]  # Error message
else:

    # User is created, let's try making the references
    okuser = auth_models.User.get_by_id(long(user[1].key.id()))
    okuser.sponsor = auth_models.User.get_by_id(long(sponsor_id)).auth_ids

原始问题

如何使用expando类进行自引用以指示哪个用户是哪个“赞助商”? “赞助商”是邀请新用户的人,因此在创作时我们必须存储它,并且将它作为参考属性而不是字符串或字符串列表存储起来会更加简洁。

我可以创建一个新用户,但我不知道如何创建一个引用,以便我可以告诉一个用户另一个用户是谁是第一个用户的赞助商,我想一种方法来模拟这个是selfreferenceproperty,因为两个对象都是用户,但复杂的是它是一个expando模型,所以我不知道如何使用引用属性。你能告诉我怎么做或者告诉我如何以最好的方式解决这个问题?

user = self.auth.store.user_model.create_user(email,
        password_raw=newpasswd)
if not user[0]:  # user is a tuple
    return user[1]  # Error message
else:

    # User is created, let's try making the reference
    okuser = auth_models.User.get_by_id(user[1].key.id())
okuser.sponsor = db.SelfReferenceProperty(User,
    collection_name='matched_images', verbose_name='Sponsor')

我不知道如何做最后一部分,用epando模型存储实际的referenceproperty。怎么办呢?

更新

似乎无法做到:

NotImplementedError: Property sponsor does not support <class 'google.appengine.ext.db.ReferenceProperty'> types.

代码:

user = self.auth.store.user_model.create_user(email,
        password_raw=newpasswd)
if not user[0]:  # user is a tuple
    return user[1]  # Error message
else:

    # User is created, let's try redirecting to login page
    okuser = auth_models.User.get_by_id(long(user[1].key.id()))
    okuser.sponsor = db.SelfReferenceProperty(auth_models.User.get_by_id(sponsor_id),collection_name='matched_distributor')
    okuser.put()

它迫使我使用字符串而不是引用,然后解决方案是可行的:

user = self.auth.store.user_model.create_user(email,
        password_raw=newpasswd)
if not user[0]:  # user is a tuple
    return user[1]  # Error message
else:

    # User is created, let's try redirecting to login page
    okuser = auth_models.User.get_by_id(long(user[1].key.id()))
    okuser.sponsor =  sponsor_id
    okuser.put()

1 个答案:

答案 0 :(得分:1)

您不能将Property类的实例分配给模型的实例 - 属性类定义属性,它们不代表单个值。

到目前为止,最简单的方法是按照常规模型添加属性。只是因为你正在使用expandos(为什么顺便说一下?)并不意味着你也不能拥有它们的常规属性。