【问题标题】:What's the best way to implement django models for multiple choice against multiple strings实现 django 模型以针对多个字符串进行多项选择的最佳方法是什么
【发布时间】:2019-09-14 12:57:52
【问题描述】:

我正在使用 Django(2.2) 和 Python(3.7) 开展一个项目,在该项目中我必须为特定场景实现模型:

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

DELIVERING VALUE
EASY TO RELEASE
FUN
HEALTH OF CODEBASE
TEAMWORK

这些问题中的每一个都有以下下拉形式的选项: - 选择 - --有帮助-- --没有帮助-- --灾难--

所有这些投票都将属于一个组,稍后我需要执行一些聚合来获得针对每个问题(如 DELIVERING VALUE)的这些选项(如有帮助)的总票数。

这是我目前在 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

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

【问题讨论】:

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


    【解决方案1】:

    我真的不喜欢将问题放在与答案相同的模型中。也许将问题放在另一个模型中会更好(例如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 行(问题组中每个问题一行)

    【讨论】:

    • 问题总是相同的,问题的数量也将保持 5,正如我上面提到的。
    • 我真的不喜欢将问题与答案放在同一个表格中。将它们移到另一个表或简单地丢弃它们(在前端显示问题但不要将它们存储在数据库中,只保留答案)
    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    • 2021-10-17
    相关资源
    最近更新 更多