Я создаю приложение, в котором пользователи могут перемещаться по страницам Treasure
объектов.
На каждой странице сокровищ есть кнопка Next
для доступа к следующему доступному сокровищу, упорядоченному по идентификатору в базе данных.
Я хочу, чтобы позволял только одному пользователю приземлиться настраница конкретного сокровища .Как только пользователь достиг страницы, экземпляр 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
.Это снизит вероятность того, что два пользователя попадут на одну и ту же страницу.Однако я не могу этого сделать, потому что мне нужно следить за порядком сокровищ.