Django并发get_or_create - python

我担心一件事。
使用Django 1.7(最默认安装中的MySQL),我正在对Django REST Framework APIView进行POST。
在那边,我正在做:

try:
    MyModel.objects.get(**some_kwargs)
except MyModel.DoesNotExist:
    MyModel.objects.custom_create(**some_kwargs)  # This also creates relative models

现在,如果我要执行大量并发请求,将会发生什么?
就像您期望的那样,我只希望第一个并发请求创建一个对象,而其他任何请求都应该获得创建的对象。

我准备好了吗,谢谢Django?必须研究隔离,事务,原子性吗?还是更多关于锁定表?如何(单元)测试呢?

请指导我。

python大神给出的解决方案

这还不足以避免出现竞争状况,因为另一个请求可以创建要在get()custom_create()之间检索的模型。如果在数据库级别上强制执行唯一性,则您的custom_create()方法可能会因IntegrityError失败。如果不是,则您的方法很好,但是由于竞争条件,您不能防止重复输入。

Django提供了get_or_create()函数。如果您的数据库强制唯一性,则这可以防止出现竞争情况。它使用create()方法,但是不使用您的custom_create()方法,因此,如果可以接受,则必须重写它。否则,您可以签出get_or_create()的source code并使用自定义创建方法自己实现。

get_or_create的核心假设是唯一性是在数据库级别上强制执行的。由于这种强制执行,如果出现竞争条件,create就会失败,并且get_or_create可能会退回以获取在竞争条件期间创建的对象。如果缺少此强制措施,则create在竞争情况下不会失败,并且将创建重复的条目(具有不同的PK)。