Django模型与面向对象设计

0 投票
1 回答
1269 浏览
提问于 2025-04-18 14:21

我为一个在线游戏写了一个任务系统。我的任务数据被转成了 json 对象,然后通过一个 JavaScript 客户端从 REST 后端(我使用的是 Django RestFramework)获取这些任务。

现在我在想,应该把和数据相关的“行为”放在哪个 django 模型 里。

我把和任务相关的数据存储在几个不同的模型里:一个叫 QuestHistory 的模型,里面有一些字段,比如 Boolean completed(表示是否完成)和 Datetime started(表示开始时间),这些信息是特定用户的(还有一个用户字段)。

然后我有一个 QuestTemplate 模型:这个部分是永远不变的,字段包括 quest_title(任务标题)和 quest_description(任务描述)。

我还有一个 Rewards 模型,以及 TaskTaskHistory 模型,它们通过一个 foreign Key field(外键字段)与任务关联。

为了把这些信息组合回任务里,我创建了一个纯 Python 的 Quest(object): 类,并在这个类上定义了一些方法,比如 check_quest_completion(检查任务完成情况)。这个类最后会被序列化。这个方法的问题是,它变得相当冗长,比如在我实例化这个类或者定义序列化器的时候。

有没有什么 Python 或 Django 的“捷径”,可以把一个 django 模型 的所有字段放到另一个类(在这里是我的 Quest 类)里?可能类似于 dict.update 方法?

或者我应该尝试把方法放在 models 里,而不使用 Quest class 呢?

我在游戏里还有其他地方的结构和任务系统很相似,比如库存系统,所以我希望能找到一个更优雅的解决方案。

1 个回答

0

你应该把Quest类里面的方法放到模型本身上,然后把Quest类去掉。

撰写回答