Python 如何将字典键与模型ID匹配
我有一个类似于以下内容的列表:Python 如何将字典键与模型ID匹配,python,django,django-models,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) 我用它来计算选票,结果是: >>
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)
我用它来计算选票,结果是:
>>>votes = Counter(my_list)
>>>print(votes)
Counter({'1': 3, '2': 2, '3': 1})
此词典中的每个键对应于选项中的一个ID
模型。如何用每个ID对应的choice\u 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']
对这样的事情:
另一个列表=['id=1的选择文本','id=2的选择文本','id=1的选择文本','id=3的选择文本','id=2的选择文本','id=1的选择文本']
获取您选择的名称:
choice\u text=choice.objects.get(pk=choice\u id)
因此,您必须在您的ID上迭代,获取选项_文本并使用:
投票[choice\u text]=投票.pop(choice\u id)
将密钥重命名为相应的选项名称 我们可以先加载一个字典,将
id
s映射到choice\u text
:
mapping = dict(Choice.objects.filter(pk__in=votes.keys())
.values_list('pk', 'choice_text'))
在这里,我们使用pk_uuin
创建了一个过滤器(严格来说,这不是必需的,但会减少数据库和Web服务器的工作量,除非id
s的数量很大)。然后我们希望它返回values\u list
s,因此对于每个元素,都有一个包含两个元素的列表:pk
和choice\u text
我们使用dict(..)
构造函数,它可以获取2个列表(或2个元组)的iterable,并将其转换为字典,其中每个元素的子列表/元组的左项是键,右项是值
现在我们可以用它来构建一个新的字典:
votes_with_text = {mapping[int(k)]: v for k, v in votes.items()}
请注意,如果有两个Choice
s具有相同的Choice\u文本
,则它将只保留计数器中的一个元素
如果具有相同问题的每两个选项
的选项
文本不同,您可以在模型级别将其与unique\u一起强制执行
:
class Choice(models.Model):
question = models.ForeignKey(Poll, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
class Meta:
unique_together = (('question', 'choice_text'), )
类选择(models.Model):
问题=models.ForeignKey(投票,on_delete=models.CASCADE)
choice_text=models.CharField(最大长度=200)
类元:
unique_-together=((‘问题’、‘选择_-text’),)
如果两个choice_-text
s相同(对于不同的选择),会发生什么情况。如果这不可能发生,我会在模型级别强制执行,我会确保在模型中强制执行。但是过滤不也应该包括问题字段吗?比如:mapping=dict(Choice.objects.filter(question=quesion\u id,pk\u in=voates.keys()).values\u list('pk','Choice\u text'))
你能解释一下pk\u in
的实际功能吗?@kstr:id本身总是唯一的,所以如果id
s都属于同一个问题(很可能是这样的),那么这些都会有相同的问题。@kstr:更新了一些关于词典构造的额外信息。我还有一个类似的问题,有点离题,但如果你能回答我,我将不胜感激。如果我想做同样的事情,但要做的是列表而不是字典呢<代码>我的列表=['1','2','1','3','2','1']
类似于:另一个列表=['choice\u text\u id=1','choice\u text\u id=2','choice\u text\u id=1','choice\u text\u id=3','choice\u text\u id=2','choice\u text\u id=1']
?然后将pk\uu-in=voces.keys()
部分更改为pk\uu-in=voces
,将带有文本的voces\u更改为带有文本的voces\u=[针对k-in-voces映射[k]
。