实现针对多个字符串的多项选择的Django模型的最佳方法是什么?

时间:2019-09-14 12:57:52

标签: python django python-3.x django-models django-2.2

我正在使用Django(2.2)和Python(3.7)开发一个项目,其中我必须为特定的scenrio实现模型:

我有一个投票,其中有五个问题,例如:

DELIVERING VALUE
EASY TO RELEASE
FUN
HEALTH OF CODEBASE
TEAMWORK

,每个问题都有以下下拉列表形式的选项: - 选择 - -有帮助- -无济于事- -灾难-

所有这些投票都将属于一个组,稍后我需要进行一些汇总,以针对每个问题(例如传递价值)获得这些选项(如帮助)的总票数。

这是我目前在Django模型中实现此方案的方式:

来自models.py

class UserGroup(models.Model):
    email = models.EmailField(primary_key=True)
    group = models.CharField(max_length=250, default='notingroup')

    def __str__(self):
        return self.group


VOTE_CHOICES = (
    ('helpful', "helpful"),
    ('meh', 'meh'),
    ('disaster', 'disaster')
)


class VotingValues(models.Model):
    value1 = models.CharField(max_length=40)
    value2 = models.CharField(max_length=40)
    value3 = models.CharField(max_length=40)
    value4 = models.CharField(max_length=40)
    value5 = models.CharField(max_length=40)
    score1 = models.CharField(choices=VOTE_CHOICES, max_length=20)
    score2 = models.CharField(choices=VOTE_CHOICES, max_length=20)
    score3 = models.CharField(choices=VOTE_CHOICES, max_length=20)
    score4 = models.CharField(choices=VOTE_CHOICES, max_length=20)
    score5 = models.CharField(choices=VOTE_CHOICES, max_length=20)
    user = models.EmailField(max_length=255)
    group = models.CharField(max_length=250, default='notingroup')
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.user + ' \'s ' + 'vote in ' + self.group

有没有更好的方法来实现这种情况?

1 个答案:

答案 0 :(得分:0)

我真的不喜欢将问题和答案放在同一模型中。也许最好将问题放在另一个模型中(例如Question

class Question(models.Model):
    q1 = models.CharField(max_length=40)
    q2 = ...

class VotingValues(models.Model):
    question = models.ForeignKey(Question)
    a1 = ...

与您的解决方案相比,我认为这更干净,但是您可以考虑更多。如果只是一次以上的回答就足够了,但是如果您可能需要创建更多带有或多或少问题的调查,那么很明显,对于每个调查,您都需要更改当前模型或创建新模型。

要解决此问题,我首先想到的是将问题和答案放入json字段或数组字段

class Question(models.Model):
    q = JSONField()

class VotingValues(models.Model):
    question = models.ForeignKey(Question)
    a = JSONField()

(请注意,我不知道聚合查询如何与json字段一起使用,因此您可能需要查找它)

我想到的另一件事是,不是使用json字段而是添加一个新模型来存储单个问题:

class Question(models.Model):
    question = models.CharField
    group = foreign key to question group

class QuestionGroup(models.Model):
    name = models.CharField 

class Vote(models.Model):
    question = foreign key to question
    score = ...

对于当前调查:您为该组创建1 question_group,并添加5 questions。当用户对该question_group进行投票时,您会在vote表中添加5行(问题组中的每个问题一行)