过去几天,我一直在努力从Django应用程序中消除竞争条件。这个问题源于这样一个事实:我有几个模型,由于各种原因,我不能在数据库级别强制执行唯一性,但是我仍然希望确保某些模型只有一个实例具有特定的属性值。为此,我提出了以下Manager和QuerySet子类(为了简洁起见,我省略了一些实用方法定义):from __future__ import unicode_literals
import logging, os
from contextlib import contextmanager
from django.db import (models, connections, router, transaction,
IntegrityError, NotSupportedError, ProgrammingError)
from django.utils.functional import cached_property
logger = logging.getLogger(__name__)
class LockingQuerySet(models.QuerySet):
"""
This is a custom QuerySet class to implement the actual get_or_create
logic.
"""
def get_or_create(self, defaults=None, **kwargs):
lookup, params = self._extract_model_params(defaults, **kwargs)
# Note that what I really want to do here is self.get