장고의 값을 원자 적으로 비교 교환 저장하려면 Model
인스턴스 Field
을 어떻게 사용할 수 있습니까? (PostgreSQL을 DB 백엔드로 사용).장고의 모델 필드를 원자 적으로 비교 교환하기
예를 들어 유사한 콘텐츠 (예 : 같은 양식의 제출)가있는 여러 게시물이 안전하지 않고 때로는 작동하는 클라이언트 측 자바 스크립트 또는 양식 UUID의 서버 측 추적에만 의존하지 않고 한 번만 적용되도록하는 경우가 있습니다 이는 악성 다중 게시물로부터 안전하지 못합니다.
예를 들어:
def compare_exchange_save(model_object, field_name, comp, exch):
# How to implement?
....
from django.views.generic.edit import FormView
from django.db import transaction
from my_app.models import LicenseCode
class LicenseCodeFormView(FormView):
def post(self, request, ...):
# Get object matching code entered in form
license_code = LicenseCode.objects.get(...)
# Safely redeem the code exactly once
# No change is made in case of error
try:
with transaction.atomic()
if compare_exchange_save(license_code, 'was_redeemed', False, True):
# Deposit a license for the user with a 3rd party service. Raises an exception if it fails.
...
else:
# License code already redeemed, don't deposit another license.
pass
except:
# Handle exception
...
원자 단위로 보장 되나요? 나는 문서에서 그것을 보지 못한다. 그렇지 않은 경우, 나의 사용 사례에서 두 개의 다른 요청이 "라이센스 예치"섹션에 입력하는 것이 가능합니다. – Danra
이것은 단일 데이터베이스 호출입니다. 가능한 한 원자 적입니다. –
@DanielRoseman은 원자이거나 그렇지 않은가요? 즉, PostgreSQL 백엔드를 가정하면 동시에이 메소드를 호출하는 두 개의 동시 요청이 모두 성공적으로 값을 업데이트 할 수 있습니까? 아니면 대부분이 성공할 것이라고 보장합니까? – Danra