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

2024-04-20 08:53:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在进行一个使用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

有没有更好的方法来实现这个场景


Tags: 项目django模型selfmodels选项场景group
1条回答
网友
1楼 · 发布于 2024-04-20 08:53:58

我真的不喜欢把问题和答案放在同一个模型里。也许把问题放在另一个模型中更好(比如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 = ...

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

相关问题 更多 >