Django中用于投票应用程序的数据库结构

时间:2014-01-17 22:00:59

标签: python mysql django

我正试图围绕如何构建我正在编写的Django webapp中的数据库表。我是网络开发的新手,但这是我第一次尝试使用数据库,所以如果这是一个愚蠢的问题请耐心等待。

网络应用程序将通过学院发布的每个奥斯卡奖,并允许用户选择一些(不同的)提名中的哪一个将赢得奥斯卡奖。每个会话的数据将通过转到[url] .com / answers / [unique id]等网址公开。整个数据也将在结果页面上提供。所以我开始编写我的模型文件,这是我到目前为止所做的:

    from django.db import models

    class Nominee(models.Model):
      award = models.CharField(max_length=50)
      title = models.CharField(max_length=50)
      key = modelsCharField(max_length=50)
      subtitle = models.CharField(max_length=50)
      numVotes = models.IntegerField()

    class Session(models.Model):
      id = models.IntegerField() # unique id of visitor
      bpictureVote = models.ForeignKey(Nominee, related_name = 'nom')
      bactorVote = models.ForeignKey(Nominee, related_name = 'nom')
      # ... for each award

我原本以为有

    class Award(models.Model):
      name = models.CharField(max_length=50)

在被提名人的开头,

    award = models.ForeignKey(Award, related_name = 'award')

但我无法弄清楚为什么这会比授予被提名者班级的一部分更好。

这真的只是一个开始,因为我有点卡住了。我是在正确的轨道上吗?我应该完全不同地做这件事(我可能应该......)?有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。

您需要单独的奖励课程,以避免每次创建被提名人时都必须输入奖励名称。通过使用ForeignKey参考,您可以确保您可以安全地重命名您的奖励,添加关于奖励的其他信息(假设将来您决定给每个奖项一个单独的页面,其中包含描述和被提名者列表),您还可以避免有一套不同的拼写和拼写错误(“最佳工程师奖”和“最佳工程师奖”)可能会发生错误。它也是有道理的 - 您的应用程序运行一组对象:用户会话,被提名者和奖励。

很少有不相关的笔记:

  • 您不需要显式的Session.id字段,django ORM会为您创建。
  • 属性名称必须是name_with_underscores,而不是camelCase。
  • 参数列表中的“=”周围没有空格:models.ForeignKey(Nominee, related_name='nom')
  • 4个空格而不是2个(除非另有明确说明)。

答案 1 :(得分:0)

我不完全确定,因为你确实提到了每个奖项的多个被提名者(假设这类似于在实际提名之前的民意调查),ManyToMany将是你所需要的关系,以便也使用额外的用户数据。 但是,如果您已将此作为提名的特定应用程序实现并实现了自定义用户模型,那么这将被重构为其他内容... 无论如何你当前的实现:

class Nominee(models.Model):
    title = models.CharField(max_length=50)
    key = modelsCharField(max_length=50)
    subtitle = models.CharField(max_length=50)
    ...

class Award(models.Model):
    name = models.CharField(max_length=50)
    nominees = models.ManyToManyField(Nominee, through='AwardNominees')
    ...

class AwardNominees(models.Model):
    nominee = models.ForeignKey(Nominee)
    award = models.ForeignKey(Award)
    user = models.ForeignKey(User)
    numVotes = models.IntegerField()
    ....

答案 2 :(得分:0)

事实证明我认为这完全错了。我现在已经完全改变了一些东西,现在它已经完全正常运行了(!)。但本着充分披露的精神,我应该说它绝对不是最好的解决方案。不过,这看起来确实不错,因为它非常简单。现在我只有一个型号:

class Vote(models.Model):
    award = models.CharField(...)    # Name of the award
    title = models.CharField(...)    # Title of the nominee
    subtitle = models.CharField(...) # Subtitle of the nominee
    uid = models.CharField(...)      # A 6 character user ID for future access

当我想显示一个用户投票的结果时,我可以使用Django的数据库工具来过滤URL中捕获的某个uid。当我想计算投票时,我可以使用过滤器和Django的count()组合来确定每个被提名者对某个奖项有多少票。对我来说听起来很合理!