1

我正在尝试使用 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>)

如果同时调用此代码将失败,因为此函数不是原子的。我不确定如何使用数据库锁来执行此操作,因为我没有锁定单个记录,并且锁定整个表似乎是不必要的浪费,因为这只影响单个成员。

对我来说,这应该是一种常见的情况,但由于某种原因,我找不到有类似问题的人。有人可以指出他们如何解决这个问题的正确方向吗?

谢谢!约翰

4

0 回答 0