加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:28:29 所属栏目:Python 来源:网络整理
导读:我正在研究在Google的AppEngine上运行的 django-nonrel项目.我想为游戏创建一个模型,其中包含所有体育运动通常共有的细节 – 即游戏时间,状态,位置等.然后我为GameBasketball,GameBaseball等建模了特定的类,并且这些类继承自基类. 这会产生一个问题但是如果
我正在研究在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特定的,也请随时回复!

解决方法

django-nonrel中不允许多表继承的原因是因为Django为这些模型提供的API通常会使用JOIN查询,如您所知.

但我认为你可以手动设置Django用它的模型继承’sugar’做的同样的事情,并且避免在你自己的代码中进行连接.

例如

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_field

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

我不相信,除了GAE数据存储API本身的速度之外,python框架的选择有很大的不同,或者django-nonrel本身比webapp2慢.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读