2017-11-29 1 views
0

나는 json 필드에 저장된 값을 가진 장고 모델이 있습니다. 하지만 일부 값은 고유해야합니다. check_unique() 함수가 있습니다. 그러나 check_unique()가 실행되지 않아 두 사용자가 동일한 값을 동시에 저장하려고 시도하면 값이 데이터베이스에 저장되지 않고 개별적으로 올바르게 저장되므로이 검사는 실패합니다. 이 문제를 방지하는 방법이 있습니까? 나는 trheadeing.Lock을 사용하여 이것을 피하려고 노력했다. 그러나 아파치는 다른 프로세스에서 실행되며,이 경우에는 작동하지 않는다.자기 제외 장고 함수의 호출

게다가, 나는 (파이썬에서) 응용 프로그램 수준에서 확인하고 데이터베이스 수준이 아닌 것이 좋겠다.

코드는 다음과 같습니다

semaphore.claim() 
try: 
    uniques = check_unique(self.answers) 
    if not uniques: 
     self.go_save() 
     semaphore.release() 
     return Response("All OK") 
except Exception as e: 
     semaphore.release() 
     return e 

답변

0

당신이 장고 원자 요청 봤어? https://docs.djangoproject.com/en/1.11/topics/db/transactions/#django.db.transaction.atomic

내가 아는 한, 당신이 데이터베이스와 함께 트랜잭션을 아토믹하면 두 번째 사용자가 데이터베이스에 저장할 수 없습니다. 기본적으로 원자는 값을 데이터베이스에 저장하려고 시도하지만 예외를 인식하면 데이터베이스에 대한 변경 사항을 되돌려 놓습니다.

또 다른 접근법은 값을 두 번 검사하는 사용자 정의 유효성 검사기를 만드는 것입니다. 그래서 일단 값이 db에 있는지 확인한 다음 x 초 후에 확인합니다 (즉, 두 사용자가 정확히 같은 시간을 확인할 수 없도록 무작위로 지정). 이렇게하면 사용자 1이 이미 데이터베이스에 저장 한 경우 두 번째 검사에서이를 확인하고 작업을 취소합니다.

마지막으로 https://github.com/alecthomas/voluptuous을 확인하십시오. 그것은 당신이 필요로하는 것일지도 모른다!

희망이 있습니다.