我的项目中的Django模型结构

时间:2012-03-20 11:55:07

标签: database django django-models

我正在创建一个基于文本的浏览器游戏,需要一些关于django模型结构的建议。所有示例都来自同一个项目,因此,如果您已经从上到下阅读了所有问题,我将不会重复相同的信息。


第一个问题

我有一个auth应用,其中包含用户个人资料(Player模型),alliance应用,其中包含有关所有工会玩家加入的信息以及代表奖励的medals应用对于球员和联盟。

用户和联盟都可以分配奖牌,因此其中一个选项是在PlayerAlliance模型中创建一个链接到Medal的M2M字段。

另一个选项会使medals个应用在我的任何其他项目中都可用。这种方法包括在Medal模型中使用通用关系,该关系链接到PlayerAlliance

哪种解决方案更像django,或者我可以做但是我想要?


第二个问题

玩家可以完成任务。任务的场景差异很大,因此我需要某种方法为每个任务编写唯一的任务进度检查代码。

任务保存在数据库中,其中包含有关奖励的信息(几乎相同)。我应该在哪里为每项任务编写唯一代码?也许我应该稍后添加一些字段和eval()?然后所有信息都将保存在数据库中。

此外,任务需要一些跟踪,例如,想象一个简单的任务转到手动部分(只是为了确保玩家知道它在哪里)。然后我需要在某处注册玩家是否访问过手册页。我想在任务应用程序中创建另一个模型TaskTrackers。然后又出现了另一个问题。如果我应该将Player的OneToOne字段添加到TaskTrackers,反之亦然?


总而言之,主要问题是我是应该将OneToOneFields / M2M字段添加到用户配置文件模型还是将OneToOneFields / Foreigneys从目标模型添加到用户模型?后者会使我的应用程序更可重用,但第一种方法可能更合乎逻辑。

等待答案。

1 个答案:

答案 0 :(得分:0)

您的第一个问题是,您可以使用M2M到Medal,或使用通用外键。你最终会得到一些与M2M的连接表。使用通用外键,您将没有任何连接表,但您将获得内容类型的额外查询。因此,您可能需要设置两种方式,并查看哪种方式会影响性能

关于第二个问题,我可能会采用“任务”模型的方法,该模型包含一个或多个可以设置为内联formset的“Step”模型。然后你需要一个像“CompletedPlayerTasks”这样的表,或者类似的表,它包含玩家ID,任务ID和步骤ID。如果该表中存在步骤ID,则任务已完成。

听起来你需要能够为每个任务的步骤创建自定义字段和表单,这在Django中并不是非常难以实现。有some off the shelf solutions来执行此操作,但您可能需要自己编写。

最后,我不会将包含您的用户配置文件的应用程序命名为“auth”,这可能会导致Django的contrib.auth应用程序出现命名空间问题。我会将其命名为“个人资料”,这样该应用的功能和包含内容就更明显了。

希望能给你一些想法。