我正在做一个运行在谷歌AppEngine上的django-nonrel项目。我想为一个游戏创建一个模型,其中包含了所有运动的常见细节--即比赛时间、状态、位置等。然后我为GameBasketball、GameBaseball等创建了特定类的模型,这些类继承自基类。
然而,如果我想检索某一天的所有游戏,这就会产生一个问题:
Game.objects.filter(gametime=mydate)这将返回一个错误:
DatabaseError: Multi-table inheritance is not supported by non-relational DBs.我知道AppEngine不支持JOIN,所以这个失败是有道理的。但我不确定如何在非关系环境中正确处理此问题。我尝试过的一个解决方案是将Game转换为一个抽象基类,虽然这允许我以一种很好的方式对数据建模-但它仍然不能解决上面的用例,因为它不可能为抽象基类获取对象。
这里唯一的解决方案是将所有可能运动的所有数据(并将与特定运动无关的字段保留为空)放在Game模型中,还是有更好的方法来解决此问题?
编辑:我更感兴趣的是在任何noSQL设置中,而不是在AppEngine上,正确地处理这类问题的方法。所以,即使你的答案不是GAE特定的,也可以随时回复!
发布于 2012-06-20 20:41:55
django-nonrel中不允许多表继承的原因是,如您所知,Django为这类模型提供的API将经常使用连接查询。
但我认为你可以像Django一样手动设置它的模型继承“糖”,并且避免在你自己的代码中做连接。
例如
class Game(models.Model):
gametime = models.DateTimeField()
# etc
class GameBasketball(models.Model):
game = models.OneToOneField(Game)
basketball_specific_field = models.TextField()当您创建一个新的GameBasketball来创建相应的Game实例时,您将需要一些额外的工作(您可以尝试一个自定义管理器类),但在那之后,您至少可以做您想做的事情,例如
qs = Game.objects.filter(gametime=mydate)
qs[0].gamebasketball.basketball_specific_fielddjango-nonrel和djangoappengine在GitHub上有了一个新家:https://github.com/django-nonrel/
除了GAE datastore API本身的速度之外,我不相信python框架的选择会有很大的不同,或者django-nonrel天生就比webapp2慢。
发布于 2012-06-21 10:34:54
对于将来有这个问题的其他人,这里是我最终解决这个问题的方法。请记住,这在某种程度上是特定于mongo的解决方案,AFAIK没有简单的方法来解决这个问题,只使用基本的非Keep类。
对于Mongo,我能够通过使用嵌入式文档(其他noSQL设置可能具有类似的软模式类型功能)来解决这个问题,简化的代码如下:
class Game(models.Model):
gametime = models.DateTimeField()
# etc
details = EmbeddedModelField() # This is the mongo specific bit.
class GameBasketballDetails(models.Model):
home = models.ForeignKey(Team)
# etc现在,当我实例化游戏类时,我在details字段中保存了一个GameBasketballDetails对象。因此,我现在可以这样做:
games = Game.objects.filter(gametime=mydate)
games[0].details.basketball_specific_method()这是一个可以接受的解决方案,因为它允许我查询游戏模型,但仍然可以获得我需要的“孩子”特定信息!
https://stackoverflow.com/questions/11092854
复制相似问题