实现 django 模型的最佳方法是什么,用于针对多个字符串进行多项选择的多项选择



我正在做一个使用 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 行(问题组中的每个问题各一行(

最新更新