我有一个类似于以下内容的列表:
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']
答案 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
,因此对于每个元素都有一个包含两个元素的列表:pk
和choice_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