Django - Как избежать запроса на тот же объект - PullRequest
0 голосов
/ 02 июня 2018

Я прошу прощения за очень длинное сообщение, но я новичок в этом и мне нужны ваши знания и советы о Python и Django .

По сути, яЯ разрабатываю небольшую игру " вопросы и ответы ". У меня есть модель со всеми вопросами с их кодами и т. д.

Участники войдут в систему (их может быть от 5 до 20 участников накаждой игре), и на экране у них будет опция « ASK A QUESTION ».Все участники могут нажать на кнопку одновременно, так как я могу быть уверен, что каждый пользователь получает отдельный вопрос ?.Очевидно, я уже думал, при размещении полей true / false , если вопрос уже использовался, но идея состоит в том, чтобы избежать дублирования.

Я пришел из JAVA ,поэтому с синхронизированные методы не позволят получить доступ к методу в одно и то же время, избегая дублирования результатов.Так есть ли что-то подобное в Python ?или есть способ избежать этого дублирования?

Большое спасибо!

1 Ответ

0 голосов
/ 03 июня 2018

Вы можете сделать это, используя transaction.atomic и поле, используемое в качестве флага, чтобы указать, что вопрос задан.(is_asked?)

def myview(request):
    with transaction.atomic():
        valid_questions = Question.objects.select_for_update()\
            .filter(is_asked=False)
        # some code here to get a valid question
        # and return the question, then saving it as being 
        # is_asked = True before exiting the atomic block.

Что transaction.atomic() гарантирует, что все взаимодействие будет заключено в одну транзакцию и select_for_update() блокирует таблицу до завершения этой транзакции.Таким образом, параллельный щелчок ждет своего хода, и база данных находится в согласованном состоянии, прежде чем сработает следующий поиск.

...