我正在尝试使用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>)
如果同时调用此代码,则此代码将失败,因为此函数不是原子函数。我不知道如何使用数据库锁来执行此操作,因为我没有锁定单个记录,并且锁定整个表似乎不必要地浪费,因为这只会影响单个成员。
对我而言,这应该是一种常见的情况,但由于某些原因,我找不到有类似问题的人。有人能指出我如何解决这个问题的正确方向吗?
谢谢! 约翰