首页 > 解决方案 > 疯狂的字段数

问题描述

我想为我的 Django 数据库中的每条记录记录 144 多条单独的数据。我想我知道我需要为每个数据点创建一个字段,但它似乎效率不高。有没有更有效的方法来做到这一点。它是一个评分系统,所以我需要能够输入值 1 到 10 以及 x(计为 10)和 m(计为 0)。分数以 3 或 6 个值为一组记录

有什么想法吗

修正案 我已经研究了好几天了,大声说出来似乎很简单,但我在谷歌上找不到任何指导。我决定让这个原则在 6 个分数上起作用,但最终它需要能够存储 144 个分数!我的模型如下所示:

class ScoreSheet(models.Model):
SCORE_ENTRY = (
    ('0', '0',),
    ('X','X',),
    ('10', '10',),
    ('9', '9',),
    ('8', '8',),
    ('7', '7',),
    ('6', '6',),
    ('5', '5',),
    ('4', '4',),
    ('3', '3',),
    ('2', '2',),
    ('1', '1',),
    ('M', 'M',),
)
Score_1 = models.CharField( max_length=2, default=0, blank=True, choices=SCORE_ENTRY) 
Score_2 = models.CharField( max_length=2, default=0, blank=True, choices=SCORE_ENTRY) 
Score_3 = models.CharField( max_length=2, default=0, blank=True, choices=SCORE_ENTRY) 
Score_4 = models.CharField( max_length=2, default=0, blank=True, choices=SCORE_ENTRY) 
Score_5 = models.CharField( max_length=2, default=0, blank=True, choices=SCORE_ENTRY) 
Score_6 = models.CharField( max_length=2, default=0, blank=True, choices=SCORE_ENTRY)


def convertToNumber(self):
    if self.Score_1 == 'X':
        self.Score_1 = 10
    elif self.Score_1 == 'M':
        self.Score_1 = 0
    else: 
        self.Score_1 = int(self.Score_1)
    a = int(self.Score_1)
    if self.Score_2 == 'X':
        self.Score_2 = 10
    elif self.Score_2 == 'M':
        self.Score_2 = 0
    else: 
        self.Score_2 = int(self.Score_2)
    b = int(self.Score_2)
    if self.Score_3 == 'X':
        self.Score_3 = 10
    elif self.Score_3 == 'M':
        self.Score_3 = 0
    else: 
        self.Score_3 = int(self.Score_3)
    c = int(self.Score_3)
    if self.Score_4 == 'X':
        self.Score_4 = 10
    elif self.Score_4 == 'M':
        self.Score_4 = 0
    else: 
        self.Score_4 = int(self.Score_4)
    d = int(self.Score_4)
    if self.Score_5 == 'X':
        self.Score_5 = 10
    elif self.Score_5 == 'M':
        self.Score_5 = 0
    else: 
        self.Score_5 = int(self.Score_5)
    e = int(self.Score_5)
    if self.Score_6 == 'X':
        self.Score_6 = 10
    elif self.Score_6 == 'M':
        self.Score_6 = 0
    else: 
        self.Score_6 = int(self.Score_6)
    f = int(self.Score_6)
    return a + b + c + d + e + f
total = property(convertToNumber)

如您所见,代码中有很多重复。10 分数可以以两种方式记录这一事实无济于事,作为 10 和作为仍然算作 10 的 X,但是因为它更接近目标的中心,所以在抢七的情况下使用。未命中记录为 M 但得分为 0。这就是函数 convertToNumber 的作用。这可行,但不是很优雅,也不能很好地扩展。

我的第二个问题是如何计算 6 个分数的每一端的 X 数。我可以让视图以字典或列表的形式返回分数,但无法计算出如何计算 X 的数量。我已经尝试过 Count 函数并遍历列表,但似乎都不起作用。我无法让 Count 函数查看单个记录的 6 个 Score 字段中的键并识别相似的值,它似乎想要计算单个 Key:value 的多个记录。我已经看过在模型和视图中放置任何计算但没有运气。

如果可能的话,我需要删除重复并计算 X 的数量。

是否有任何人可以提供的提示和技巧?

标签: djangodjango-models

解决方案


您是否考虑过使用django-jsonfield

帮助将您的数据分成更小的字段。

此外,您可以尝试将数据分成多个模型,它们之间具有 OneToOneField。从而使您的数据库表更小。


推荐阅读