Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将字典键与模型ID匹配_Python_Django_Django Models - Fatal编程技术网

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]