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

标签 django google-app-engine nosql django-nonrel djangoappengine

我正在开发一个在 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/

相关文章:

python - 在没有 App Engine 的情况下运行谷歌云端点

python - Redis:内存优化/性能策略

python - 如何生成在第一列插入复选框形式的多列表?

django - 如何配置 django Rest Framework 分页 url

python - 具有数组和 OR 运算符的 Django 过滤器数据库

python - 在本地主机上找不到图像

python - 使用 Google App Engine GQL 查找给定半径内的所有位置

java - 如何使用 Stackdriver Trace 在 App Engine Standard 中创建自定义跨度?

nosql - 与nosql的信息重复?

mongodb - 如何在 couchdb/NoSQL 数据存储之上实现 IMAP 服务器?