Django - 如何避免查询相同的obj

时间:2018-06-02 18:30:41

标签: python django django-models django-views

我为这条极长的消息道歉,但我对此很新,需要您对 Python Django 的知识和建议。

基本上,我正在开发一个小的" 问题和答案" game.I有一个模型,包含所有问题及其代码等。

参与者将登录(每个游戏可能有5到20名参与者),并且在屏幕上,他们将有一个选项,说明" 问一个问题" 。所有参与者可以同时点击该按钮,那么我如何确保每个用户都能获得不同的问题?显然我已经想过,在放置 true / false 字段时,如果问题已经被使用过了,那么这个想法是为了避免重复。

我来自 JAVA ,因此同步方法不允许同时访问该方法,避免重复结果。那么 Python 中有类似的东西吗?或者有没有办法避免重复?

非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以使用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()锁定表,直到此事务完成。这样,并发点击等待其轮流,数据库在下一次查找之前处于一致状态。