2016-11-27 7 views
0

나는 장고 모델의 주어진 인스턴스에 대해 특정 필드가 한 번만 기록되도록하는 확실한 방법을 찾고있다.django 모델 필드가 한 번만 기록되는지 확인하십시오. 자물쇠없이 원자력 보장

코드는 셀 또는 rq를 사용하여보기 또는 작업에서 실행되어야합니다.

나는 다음 코드를 사용하는 방법에 대해 생각하고 :

from django.db import transaction 
from django.utils.timezone import now 

... 

def perform_writeonce(object_pk): 
    with transaction.atomic(): 
     instance = MyModel.objects.get(pk=object_pk) 

     if instance.value is None: 
      instance.value = 'Value written now : {}'.format(now()) 
      instance.save() 

목적은 그 값이 한 번만 작성해야하고 그 값이 없음없는 경우에만입니다.

이 스 니펫에 확신이 있습니까? 아니면 내가 놓친 것이 있습니까?

하나의 postgresql 데이터베이스 서버와 함께 여러 gunicorn 인스턴스와 셀러리 작업자를 사용하고 있습니다.

나는 모든 비용을 들이지 않고 잠금 장치를 피하려고 노력하고 있으므로 응용 프로그램 잠금 장치가있는 모든 솔루션은 좋지 않습니다.

도움 주셔서 감사합니다.

+0

저는 확신합니다. 트랜잭션이 응용 프로그램 계층이 아닌 db 계층에 의존하기 때문입니다. – itzMEonTV

답변

0

장고 모델의 특정 인스턴스에 대해 특정 필드가 한 번만 기록되도록하는 확실한 방법을 찾고 있습니다.

예상되는 동작은 datefields에 대한 auto_now_add 옵션과 같습니다.

auto_now_add 필드가 한 번만 기록되는 것은 아닙니다. 정말로 원한다면 그 필드에 쓸 수 있습니다. 그것은 단지 관리 형태 등 기본적으로 표시되지 않습니다

당신은 Field.editable https://docs.djangoproject.com/en/1.10/ref/models/fields/#editable

Field.editable

False 경우 설정하여 다른 필드에 대해 동일한 작업을 수행 할 수 있습니다

의 입력란은 관리자 또는 기타 ModelForm에 표시되지 않습니다. 또한 모델 유효성 검사 도중 건너 뜁니다. 기본값은 True입니다.

+0

죄송합니다. 명확하지 않았습니다. auto_now_add 또는 편집 가능한 속성의 동작을 복제하려고하지 않습니다. 이 문제는 트랜잭션을 사용하는 동시성 및 동시 액세스와 관련이 있습니다. 어쨌든 고마워요 –

+0

그러면 예상되는 문제에 대한 명확한 설명을 제공해야합니다. 필드에 한 번만 쓰려면 인스턴스가 데이터베이스에 처음 저장 될 때가되어야합니다. 동시성이 문제가되는 경우 모델 코드가 문제를 해결할 적절한 위치가 아닐 수도 있습니다. 왜 태스크 큐를 사용하지 않고 셀러리가이 특정 모델에 대한 모든 업데이트를 수행하게할까요? –

+0

질문이 수정되었습니다. 이제는 더 분명해질 수 있습니다. –