Python 如何使用django模型/数据库实现队列?
我想在Django应用程序中实现一个以模型为基础的队列。我应该能够排队到队列的前面,并根据记录的创建时间从队列的后面将旧项目排出来,或者以某种方式将记录链接到彼此,这样您就可以知道哪个记录先排队,哪个记录下一个排队,依此类推。实现这一点的最佳方式是什么 在模型中创建一个Python 如何使用django模型/数据库实现队列?,python,django,Python,Django,我想在Django应用程序中实现一个以模型为基础的队列。我应该能够排队到队列的前面,并根据记录的创建时间从队列的后面将旧项目排出来,或者以某种方式将记录链接到彼此,这样您就可以知道哪个记录先排队,哪个记录下一个排队,依此类推。实现这一点的最佳方式是什么 在模型中创建一个created=models.DateTimeField()字段,并扫描记录以查找最早的记录,然后将其出列/delete()?通过这种方式,您会在性能上妥协多少?或者,有没有更好的方法链接队列项目以了解它们的排队顺序 以前也有人问
created=models.DateTimeField()
字段,并扫描记录以查找最早的记录,然后将其出列/delete()
?通过这种方式,您会在性能上妥协多少?或者,有没有更好的方法链接队列项目以了解它们的排队顺序
以前也有人问过类似的问题,但我的要求不同。我不需要像芹菜那样的任务队列/作业队列
提前感谢您。在您有多个并发连接之前,您的方式很好。例如,您可以提出如下内容:
class Message(models.Model):
created = models.DateTimeField(auto_now_add=True, db_index=True)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerKey(db_index=True)
content_object = GenericForeignKey('content_type', 'object_id')
class MessageQuerySet(models.QuerySet):
def dequeue(self, count):
items = (self.order_by('-created')
.select_related('content_object')
.values('content_object'))
self.filter(pk__in=items).delete()
return [item['content_object'] for item in items]
stack = Message.objects.dequeue(3)
如果有许多不同的进程访问堆,那么麻烦就开始了。很有可能,当您尝试将某些项目出列时,另一个进程会将一个项目置于顶部。在这种情况下,唯一正确的解决方案是使用RabbitMQ或ZeroMQ之类的消息代理。如果您希望在模型上进行简单排序,可以添加一个类似
created=models.datetime字段(auto\u now\u add=True)
的字段,然后将ordering=('created',)
添加到模型的元类中。然后,您可以使用model.objects.first()
和model.objects.last()
获取第一个和最后一个对象,并对它们执行所需的操作。根据使用量的不同,从性能的角度来看,使用芹菜或其他任务队列可能会更好——这就是任务队列的用途。