首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django Nonrel -使用noSQL解决多表继承问题?

Django Nonrel -使用noSQL解决多表继承问题?
EN

Stack Overflow用户
提问于 2012-06-19 08:22:57
回答 2查看 570关注 0票数 4

我正在做一个运行在谷歌AppEngine上的django-nonrel项目。我想为一个游戏创建一个模型,其中包含了所有运动的常见细节--即比赛时间、状态、位置等。然后我为GameBasketball、GameBaseball等创建了特定类的模型,这些类继承自基类。

然而,如果我想检索某一天的所有游戏,这就会产生一个问题:

代码语言:javascript
复制
Game.objects.filter(gametime=mydate)

这将返回一个错误:

代码语言:javascript
复制
DatabaseError: Multi-table inheritance is not supported by non-relational DBs.

我知道AppEngine不支持JOIN,所以这个失败是有道理的。但我不确定如何在非关系环境中正确处理此问题。我尝试过的一个解决方案是将Game转换为一个抽象基类,虽然这允许我以一种很好的方式对数据建模-但它仍然不能解决上面的用例,因为它不可能为抽象基类获取对象。

这里唯一的解决方案是将所有可能运动的所有数据(并将与特定运动无关的字段保留为空)放在Game模型中,还是有更好的方法来解决此问题?

编辑:我更感兴趣的是在任何noSQL设置中,而不是在AppEngine上,正确地处理这类问题的方法。所以,即使你的答案不是GAE特定的,也可以随时回复!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-20 20:41:55

django-nonrel中不允许多表继承的原因是,如您所知,Django为这类模型提供的API将经常使用连接查询。

但我认为你可以像Django一样手动设置它的模型继承“糖”,并且避免在你自己的代码中做连接。

例如

代码语言:javascript
复制
class Game(models.Model):
    gametime = models.DateTimeField()
    # etc

class GameBasketball(models.Model):
    game = models.OneToOneField(Game)
    basketball_specific_field = models.TextField()

当您创建一个新的GameBasketball来创建相应的Game实例时,您将需要一些额外的工作(您可以尝试一个自定义管理器类),但在那之后,您至少可以做您想做的事情,例如

代码语言:javascript
复制
qs = Game.objects.filter(gametime=mydate)
qs[0].gamebasketball.basketball_specific_field

django-nonrel和djangoappengine在GitHub上有了一个新家:https://github.com/django-nonrel/

除了GAE datastore API本身的速度之外,我不相信python框架的选择会有很大的不同,或者django-nonrel天生就比webapp2慢。

票数 0
EN

Stack Overflow用户

发布于 2012-06-21 10:34:54

对于将来有这个问题的其他人,这里是我最终解决这个问题的方法。请记住,这在某种程度上是特定于mongo的解决方案,AFAIK没有简单的方法来解决这个问题,只使用基本的非Keep类。

对于Mongo,我能够通过使用嵌入式文档(其他noSQL设置可能具有类似的软模式类型功能)来解决这个问题,简化的代码如下:

代码语言:javascript
复制
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对象。因此,我现在可以这样做:

代码语言:javascript
复制
games = Game.objects.filter(gametime=mydate)
games[0].details.basketball_specific_method()

这是一个可以接受的解决方案,因为它允许我查询游戏模型,但仍然可以获得我需要的“孩子”特定信息!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11092854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档