我正在开发一个在 Google 的 AppEngine 上运行的 django-nonrel 项目。我想为一个游戏创建一个模型,其中包含所有运动通常共有的细节 - 即游戏时间、状态、位置等。然后我为 GameBasketball、GameBaseball 等建模了特定类,这些类继承自基类。
但是,如果我想在某一天检索类似所有游戏的内容,这会产生问题:
Game.objects.filter(gametime=mydate)
这将返回一个错误:
DatabaseError: Multi-table inheritance is not supported by non-relational DBs.
我知道 AppEngine 不支持 JOIN,因此失败是有道理的。但我不确定如何在非关系环境中正确解决这个问题。我尝试过的一个解决方案是将 Game 变成一个抽象基类,虽然这允许我以一种很好的方式对数据进行建模 - 但它仍然没有解决上面的用例,因为它不可能获取抽象对象基类。
这里唯一的解决方案是将所有可能的运动的所有数据(并且只留下与特定运动无关的字段为空)在游戏模型中,还是有更优雅的方法来解决这个问题?
编辑: 我更感兴趣的是了解在任何 noSQL 设置中处理此类问题的正确方法,而不是专门针对 AppEngine。因此,即使您的答案不是特定于 GAE,也请随时回复!
最佳答案
对于将来遇到此问题的任何其他人,以下是我最终解决该问题的方法。请记住,这在某种程度上是特定于 mongo 的解决方案,据我所知,没有简单的方法可以仅使用非相关基类来解决此问题。
对于 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
现在,当我实例化 Game 类时,我在详细信息字段中保存了一个 GameBasketballDetails 对象。所以我现在可以:
games = Game.objects.filter(gametime=mydate)
games[0].details.basketball_specific_method()
这是一个可以接受的解决方案,因为它允许我查询游戏模型,但仍然可以获得我需要的“ child ”特定信息!
关于Django Nonrel - 使用 noSQL 解决多表继承问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11092854/