我正在构建一个应用程序,用户可以在其中浏览Treasure
对象的页面。
每个藏宝页面都有一个Next
按钮,可以访问下一个可用的藏宝,并按数据库上的ID进行排序。
我要只允许一个用户登陆特定的藏宝页。用户到达页面后,Treasure
实例将由该用户(treasure.captured_by = user
)拥有。
因此,Next
按钮应返回从未被其他用户捕获的宝藏页面。不幸的是,当连接了许多用户时,有时会发生两个用户登陆同一宝藏页面的情况。我该如何解决?
A
在页面treasures/1
B
在页面treasures/2
Next
。 treasures/3
,另一个进入treasures/4
treasures/3
,这是不正确的。该按钮将调用一个视图,其功能类似于:
def get_next_available_treasure(request, current_treasure_id):
"""Retrieve the next unclaimed treasure."""
treasure = Treasure.objects.filter(
id__gt=current_treasure_id, # Only consider Treasures that have been stored later on the db
captured_by__isnull=True
).order_by('id').first()
return redirect('treasure-page', treasure_id=treasure.id)
在urls.py
中:
url(r'^go-to-next/(?P<current_treasure_id>\d+)/$',
views.go_to_next_available_treasure,
name='next-treasure'),
在模板中:
<a href="{% url 'textool:next-treasure' treasure.pk %}">Next</a>
问题:如何解决此问题并在宝藏页面/实例上进行某种“锁定”?
我考虑过当用户单击Next
时随机分配宝物的顺序。这样可以减少两个用户登陆同一页面的可能性。但是,我不能这样做,因为我需要保持宝物的顺序。