如何将字典键与模型ID匹配

时间:2018-06-27 12:25:41

标签: python django django-models

我有一个类似于以下内容的列表: my_list = ['1', '2', '1', '3', '2', '1']

这些是投票,每个投票对应于此模型的ID,其中包含民意测验的选择:

class Choice(models.Model):
    question = models.ForeignKey(Poll, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)

我正在使用Counter来计算票数,结果是这样:

>>>votes = Counter(my_list)
>>>print(votes)
Counter({'1': 3, '2': 2, '3': 1})

此词典中的每个键对应于Choice模型中的ID。如何为每个ID用相应的choice_text替换字典的键名? 我想以一本看起来像以下的字典结尾:

{'choice_text for id=1':3, 'choice_text for id=2':2, 'choice_text for id=3':1}

编辑:此外,如果我想对已经拥有的列表执行相同的操作,该怎么办。

my_list = ['1', '2', '1', '3', '2', '1']

像这样:

another_list = ['choice_text for id=1', 'choice_text for id=2', 'choice_text for id=1', 'choice_text for id=3', 'choice_text for id=2', 'choice_text for id=1']

2 个答案:

答案 0 :(得分:3)

获取您选择的名称:

choice_text = Choice.objects.get(pk=choice_id)

所以您必须遍历id,获取choice_text并使用:

votes[choice_text] = votes.pop(choice_id) 将键重命名为相应的选择名称。

答案 1 :(得分:2)

我们首先可以加载将id映射到choice_text的字典:

mapping = dict(Choice.objects.filter(pk__in=votes.keys())
                             .values_list('pk', 'choice_text'))

因此,在pk__in中,我们进行了过滤(严格来说,这不是必需的,但是将减少数据库和Web服务器的工作量,除非id的数量很大)。然后,我们希望它返回values_list,因此对于每个元素都有一个包含两个元素的列表:pkchoice_text

我们使用dict(..)构造函数,该构造函数可以获取2个列表(或2个元组)的可迭代对象,并将其转换为字典,其中对于每个元素,子列表/元组的左项都是关键,正确的项就是值。

现在我们可以使用它来构建新的字典:

votes_with_text = {mapping[int(k)]: v for k, v in votes.items()}

请注意,如果有两个{<1>}与相同 Choice,则它将仅保留元素中的一个。柜台。

如果choice_text对于具有相同choice_text的每两个Choice应该不同,则可以在模型级别使用question来实施:

unique_together