删除GAE NDB中结构化重复列表中的一个元素/条目

时间:2014-04-05 19:02:44

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我最近在Google App Engine上从ext.db切换到NDB并遇到了困难(而且我对OOP还不熟悉)。

问题:用户可以输入他们喜欢的水果,分数和评论,这些水果,评分和评论将保存在结构化列表中。用户配置文件页面将列出水果名称和它们旁边的“删除水果”按钮,当单击它时,我希望从列表中删除条目,因此从结构化列表中删除。我能够使用ext.db删除列表中的元素而没有问题。

这是我以前用 ext.db ,没有“得分”或“评论”存储的内容:

class UserProfile(db.Model):
        uid            = db.StringProperty(required=True)
        password       = db.StringProperty(required=True)
        firstName      = db.StringProperty(required=True)
        favFruits      = db.StringListProperty()

 def deleteFruit(self, fruitName):
    if fruitName in self.favFruits: # <--favFruit is the list of fruit for a user
        self.favFruits.remove(fruitName)
        self.put()
        return OK
    else:
        return NOT_FOUND

这将从数据库中删除用户fruitName指定的名称。

我想做的就是上面,实际上,现在使用名为favFruits的结构化列表,使用 NDB

 class FavFruits(ndb.Model):
    fruit    = ndb.StringProperty()
    score    = ndb.IntegerProperty()
    comment  = ndb.TextProperty()

 class UserProfile(ndb.Model):
    uid            = ndb.StringProperty(required=True)
    password       = ndb.StringProperty(required=True)
    firstName      = ndb.StringProperty(required=True)
    favFruits      = ndb.StructuredProperty(FavFruits, repeated=True)

我希望使用用户输入的favFruitsfruitName中找到条目,并删除与该fruitName相关的所有与favFruits相关的元素(以便删除与fruit==fruitName相关的水果,分数,评论) 。我想避免循环。

我尝试了remove()delete()组合的变体而没有运气。任何指导将不胜感激!

1 个答案:

答案 0 :(得分:0)

StructuredProperty是一个列表,但您现在存储的是一个复杂对象而不是基本字符串,它与Fruit名称不匹配。使用pop将索引作为参数。您需要通过迭代检查Fruit名称的列表来找到您要删除的Fruit的索引。