我正在使用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
有没有更好的方法来实现这种情况?
答案 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行(问题组中的每个问题一行)