django - 在循环中修改后如何过滤 Django 查询集
问题描述
我最近一直在使用 Django,这让我很困惑(尽管我也喜欢它)。
我现在面临的问题是当我循环时,在修改查询集的循环中,在下一个循环中.filter
不起作用。
因此,让我们看下面的简化示例:
我有一本由这样的查询集组成的字典
animal_dict
= {鸡:6,奶牛:7,鱼:1,羊:2}
查询集被称为self.animals
for key in dict:
if dict[key] < 3:
remove_animal = max(dict, key=dict.get)
remove = self.animals.filter(animal = remove_animal)[-2:]
self.animals = self.animals.difference(remove)
key[replaced_industry] = key[replaced_industry] - 2
我正在尝试做的事情如下:我的目标是动物下面需要有一个平衡。因此,由于没有足够的鱼,因此 n 最高的 2 只动物必须离开(奶牛)。然后在第二个循环中 - 由于没有足够的羊,因此 n 最高的 2 只动物必须再次走(鸡)。
现在它第一次循环(使用fish),.filter
完全按照它应该做的。但是,当我第二次循环它(对于羊)时,remove = self.animals.filter(animal = remove_animal)[-2:]
给我的输出与animal =
过滤器不符。当我remove
在第二个循环中打印时,它会返回所有不同动物的列表(而不仅仅是 1 个)。
在循环之后,dict
应该是这样的: {chicken: 4, cows: 5, fish: 1,sheep: 2} 这是因为第一头牛会下降 2 并且它是max
,然后鸡会下降 2,因为它那么是max
我肯定在这里遗漏了一些 Django 逻辑,但对我来说这似乎很奇怪。我希望这个问题得到很好的理解,否则很高兴进一步澄清。
解决方案
正如其他人指出的那样,每次您调用时,self.animals.filter
您都是在向数据库发出请求,这不应该在循环中完成。
目前尚不清楚您要达到的目标,但您似乎希望每种动物的数量(几乎?)相同,并且您可以对其执行的唯一操作是减少数量的动物。
如果可以的话,最好避免循环。
如果您希望它们都是相同的数字,并且您只能减少您拥有的动物数量,那么最好的解决方案是
fewest_number = min(self.animals.values())
self.animals = {animal: fewest_number for animal in self.animals.keys()}
如果你想说,允许最小动物的容忍度+1
fewest_number = min(self.animals.values()) + 1
self.animals = {animal: fewest_number for animal in self.animals.keys()}
如果您可以增加每种动物的数量,那么您可以找到平均值:
average_number = sum(self.animals.values()) / len(self.animals)
self.animals = {animal: average_number for animal in self.animals.keys()}
推荐阅读
- dynamics-365 - 从 D365 ONLINE 插件创建 Sharepoint ONLINE 文件夹
- language-agnostic - 很难选择合适的变量名
- javascript - 每次单击按钮时显示新元素
- javascript - 将 Select2 下拉列表中的参数传递给 Kendo UI MVC 数据源
- c - 如何检查变量中是否包含某个字符串?在if条件下如何做到这一点?
- image - 当 Platform.runLater 调用函数时,JavaFX 图像不会改变
- python - 如何访问值?
- github - Github 分叉和收听来自公共 github 的更新
- python - 获取分组数据框中列的最大计数
- javascript - 如何理解网站正在将上传的文件发送到其服务器?