feat: 优化safe_get_or_create以处理并发

This commit is contained in:
caoqianming 2024-12-29 11:31:22 +08:00
parent 3ef3607220
commit c5d8f70251
1 changed files with 8 additions and 4 deletions

View File

@ -114,10 +114,14 @@ class BaseModel(models.Model):
@classmethod @classmethod
def safe_get_or_create(cls, **kwargs): def safe_get_or_create(cls, **kwargs):
defaults = kwargs.pop('defaults', {}) defaults = kwargs.pop('defaults', {})
try: for attempt in range(5):
return cls.objects.get_or_create(defaults=defaults, **kwargs) try:
except IntegrityError: return cls.objects.get_or_create(defaults=defaults, **kwargs)
return cls.objects.get(**kwargs), False except IntegrityError:
if attempt < 4:
time.sleep(0.1)
else:
raise
def handle_parent(self): def handle_parent(self):
pass pass