gpt4 book ai didi

python - Django删除查询集的最后五个以外的所有内容

转载 作者:IT老高 更新时间:2023-10-28 22:24:35 27 4
gpt4 key购买 nike

我这里有一个 super 简单的 django 模型:

class Notification(models.Model):
message = models.TextField()
user = models.ForeignKey(User)
timestamp = models.DateTimeField(default=datetime.datetime.now)

使用 ajax,我每分钟检查一次新消息。我随时只向用户显示五个最近的通知。我试图避免的是以下情况。

用户登录并且没有通知。当用户的窗口打开时,他会收到 10 条新消息。因为我只给他看五个,没什么大不了的。当用户开始删除他的通知时,就会出现问题。如果他删除了显示的五个,那么旧的五个将在下一次 ajax 调用或刷新时显示。

我想让模型的保存方法在保存新对象时删除除 5 个最新对象之外的所有内容。不幸的是,您不能使用 [5:] 来执行此操作。帮忙?

编辑

我试过这个没有按预期工作(在模型的保存方法中):

    notes = Notification.objects.filter(user=self.user)[:4]
Notification.objects.exclude(pk__in=notes).delete()

我找不到奇怪行为的模式,但经过一段时间的测试,它只会在创建新模式时删除最近的模式。我不知道为什么会这样。排序在模型的 Meta 类中处理(按时间戳降序)。感谢您的帮助,但我的方式似乎是唯一一种始终如一的方式。

最佳答案

这有点老了,但我相信你可以做到以下几点:

notes = Notification.objects.filter(user=self.user)[:4]
Notification.objects.exclude(pk__in=list(notes)).delete() # list() forces a database hit.

它需要两次点击,但避免使用带有事务中间件的 for 循环。

使用 list(notes) 的原因是 Django 在没有它的情况下创建了单个查询,而在 Mysql 5.1 中,这会引发错误

(1235, "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'")

通过使用 list(notes),我们强制查询 notes,避免了这种情况。这可以进一步优化为:

notes = Notification.objects.filter(user=self.user)[:4].values_list("id", flat=True)  # only retrieve ids.
Notification.objects.exclude(pk__in=list(notes)).delete()

关于python - Django删除查询集的最后五个以外的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1851197/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com