我正在尝试使用 django 实现最大大小的列表。例如我有一个这样的模型:
class RecentView(models.Model):
member = models.ForeignKey(Member)
product = models.ForeignKey(Product)
view_time = models.DateTimeField(auto_now=True, auto_now_add=True)
class Meta:
unique_together = ('member', 'product')
基本上,我会保留成员最近查看过的产品列表。我想将每个成员的记录数限制在 X 内。换句话说,只保留该成员最近查看过的 X 个产品。因此,在新插入期间,如果该成员已有 X 条记录,则最新条目应覆盖最旧的条目,以保持该成员 = X 的记录总数。在我看来,我目前执行查询以首先获取记录数:
num_views = RecentView.objects.filter(member_id=<some_mid>).count()
然后我继续逻辑:
if num_views >= X:
# Do not call create(), but instead issue another query to grab the oldest record and then update it
....
else:
view = RecentView.objects.create(member_id=<some_mid>, product_id=<some_pid>)
如果同时调用此代码将失败,因为此函数不是原子的。我不确定如何使用数据库锁来执行此操作,因为我没有锁定单个记录,并且锁定整个表似乎是不必要的浪费,因为这只影响单个成员。
对我来说,这应该是一种常见的情况,但由于某种原因,我找不到有类似问题的人。有人可以指出他们如何解决这个问题的正确方向吗?
谢谢!约翰