python - 如何使用非规范化数据保持代码整洁?

标签 python google-app-engine google-cloud-datastore app-engine-ndb denormalization

我将分两部分提出这个问题:首先是一般问题,然后是针对我的具体用例的问题。

一般问题:

我正在构建一个播客应用程序,希望我们能够拥有用户。用户有订阅、设置等,我想将其存储在 User 对象上,但订阅和设置不属于我的代码中的同一模块。

如何构建代码,以便将用户的所有相关数据存储在一起,但定义和处理特定属性的代码可以分开?

我的具体用例

我正在 Google App Engine 上构建后端。我的用户类看起来像这样:

class User(ndb.Model):
    username = ndb.StringProperty(required=True)
    email = ndb.StringProperty(required=True)
    ...

现在我可以为订阅、设置等添加另一个属性,但这些定义并不真正属于用户模块。我尝试使用 ndb.PolyModel 定义 SubscriptionsHolderSettingsHolder 类,但通过多重继承,仅查询 User 中的最后一个父类(super class)定义支持查询。

我可以让 settings 和其他模块直接查询 User 模型,但这会导致循环依赖,其中 User users 模块依赖于 settings 用于子类化,settings 依赖于 users 进行查询。我知道我可以通过移动 import 语句来解决循环依赖关系,但这对我来说似乎是一种黑客行为。

最佳答案

我的方法是将用户设置数据视为单独但相关的集合。我没有使用子类化或使用 PolyModel,而是简单地引入了一种方法来暗示这些数据集之间的 1:1 关系。

一种方法是将 KeyProperty 添加到链接回 UserSettings。另一种方法是使用相关 User 实体使用的相同 ID/名称创建每个 Settings 实体。第二种方式允许在拥有 User 键后直接调用 Settings.get_by_id()

关于python - 如何使用非规范化数据保持代码整洁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28437189/

相关文章:

java - 谷歌应用引擎: When is auto id available?

android - 通过 App Engine 登录 Facebook

python - Google App Engine 数据存储区建模问题

python - ndb.toplevel 用于 python 方法与请求处理程序

java - 如何使用 Java 从 Google 数据存储中删除行?

python unicode 支持

python - 将列拆分并转换为聚合列

python - 从 google.cloud 导入 firestore ModuleNotFoundError : No module named 'google'

python - Django 分页泛型 LISTCREATEAPIview 中的条件查询集

java - Google App Engine 1.6.4 上的 Guice 启动时间