我正在创建一个基于文本的浏览器游戏,需要一些关于django模型结构的建议。所有示例都来自同一个项目,因此,如果您已经从上到下阅读了所有问题,我将不会重复相同的信息。
第一个问题
我有一个auth
应用,其中包含用户个人资料(Player
模型),alliance
应用,其中包含有关所有工会玩家加入的信息以及代表奖励的medals
应用对于球员和联盟。
用户和联盟都可以分配奖牌,因此其中一个选项是在Player
和Alliance
模型中创建一个链接到Medal
的M2M字段。
另一个选项会使medals
个应用在我的任何其他项目中都可用。这种方法包括在Medal
模型中使用通用关系,该关系链接到Player
或Alliance
。
哪种解决方案更像django,或者我可以做但是我想要?
第二个问题
玩家可以完成任务。任务的场景差异很大,因此我需要某种方法为每个任务编写唯一的任务进度检查代码。
任务保存在数据库中,其中包含有关奖励的信息(几乎相同)。我应该在哪里为每项任务编写唯一代码?也许我应该稍后添加一些字段和eval()?然后所有信息都将保存在数据库中。
此外,任务需要一些跟踪,例如,想象一个简单的任务转到手动部分(只是为了确保玩家知道它在哪里)。然后我需要在某处注册玩家是否访问过手册页。我想在任务应用程序中创建另一个模型TaskTrackers
。然后又出现了另一个问题。如果我应该将Player
的OneToOne字段添加到TaskTrackers
,反之亦然?
总而言之,主要问题是我是应该将OneToOneFields / M2M字段添加到用户配置文件模型还是将OneToOneFields / Foreigneys从目标模型添加到用户模型?后者会使我的应用程序更可重用,但第一种方法可能更合乎逻辑。
等待答案。
答案 0 :(得分:0)
您的第一个问题是,您可以使用M2M到Medal,或使用通用外键。你最终会得到一些与M2M的连接表。使用通用外键,您将没有任何连接表,但您将获得内容类型的额外查询。因此,您可能需要设置两种方式,并查看哪种方式会影响性能
关于第二个问题,我可能会采用“任务”模型的方法,该模型包含一个或多个可以设置为内联formset的“Step”模型。然后你需要一个像“CompletedPlayerTasks”这样的表,或者类似的表,它包含玩家ID,任务ID和步骤ID。如果该表中存在步骤ID,则任务已完成。
听起来你需要能够为每个任务的步骤创建自定义字段和表单,这在Django中并不是非常难以实现。有some off the shelf solutions来执行此操作,但您可能需要自己编写。
最后,我不会将包含您的用户配置文件的应用程序命名为“auth”,这可能会导致Django的contrib.auth应用程序出现命名空间问题。我会将其命名为“个人资料”,这样该应用的功能和包含内容就更明显了。
希望能给你一些想法。