首页 > 解决方案 > 在循环中修改后如何过滤 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 逻辑,但对我来说这似乎很奇怪。我希望这个问题得到很好的理解,否则很高兴进一步澄清。

标签: djangodjango-modelsdjango-queryset

解决方案


正如其他人指出的那样,每次您调用时,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()}

推荐阅读