我正在做一个使用 Django(2.2( 和 Python(3.7( 的项目,其中我必须为特定的场景实现模型:
我有一个投票,我们有五个问题,例如:
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
是否有更好的方法来实现此方案?
我真的不喜欢把问题放在与答案相同的模型中。 也许最好将问题放在另一个模型中(例如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 行(问题组中的每个问题各一行(