gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:30:24 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com