【问题标题】:How can you exclude an item in the query set while in a for loop?在 for 循环中如何排除查询集中的项目?
【发布时间】:2023-03-27 18:22:01
【问题描述】:

我想删除

results = Model.objects.filter(condition - satisfied... etc.)

然后我遍历查询集并在我浏览我的代码时删除每个对象:

for a in results:

### code ###

    results.exclude(id=a.id)

无论我如何排除,结果对象都不会改变。有没有办法在我遍历查询集时“弹出”它们?

【问题讨论】:

  • 你需要这个作为查询集吗?
  • @Gocht。我知道可以从查询集中提取对象并使用 .remove 将它们从列表中取出。我正在寻找是否有办法“就地”做到这一点。
  • 查询集不会就地更新。您需要将查询集结果重新捕获到局部变量中。
  • @karthikr。你是怎样做的?我认为把它放在结果中已经使它成为一个局部变量。

标签: django django-models django-queryset


【解决方案1】:

但是你会为每个循环做数据库查询,因为你在每个循环中调用.exclude()

如果您只想为每个循环删除对象,您可以使用:

new_list = list(results)
for a in results:  
    ### code ###
    new_list.remove(a)

【讨论】:

  • 如果查询的时间消耗是一个问题,这一点很重要。然后,您可以仅过滤 new_list 中剩余的内容(或者更好的是,您可以创建一个 remove_pks 列表并在 for 循环之后使用 results = results.exclude(pk__in=remove_pks)
【解决方案2】:

像这样更改代码的最后一部分:

for a in results:

### code ###

    results = results.exclude(id=a.id)

因为 queryset.exclude() 返回一个新的查询集,而不改变现有的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    相关资源
    最近更新 更多