Django删除查询集的最后五个,除最后五个

我在这里有一个超级简单的Django模型:

class Notification(models.Model):

message = models.TextField()

user = models.ForeignKey(User)

timestamp = models.DateTimeField(default=datetime.datetime.now)

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

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

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

我尝试了这个没有按预期工作的方法(在模型的save方法中):

    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()

以上是 Django删除查询集的最后五个,除最后五个 的全部内容, 来源链接: utcz.com/qa/404985.html

回到顶部