2010-12-02 7 views

답변

10

당신은 당신이 모든 변경 사항을 저장하지 않습니다이 경우의 메소드를 저장하고 기존 엔티티인지 확인 모델을 재정의 할 수

def save(self, *args, **kwargs): 
    if self.id is None: 
     super(ModelName, self).save(*args, **kwargs) 

엔티티가있다 그래서이 예제에서 당신은 단지 변경 사항을 저장 id이 아직 없습니다. 아직 삽입되지 않은 새로운 엔티티 인 경우에만 해당됩니다.

다른 솔루션에 추가
+0

올바르지 않습니다. 테이블에 존재하지 않는'Non 'ID도 새로운 레코드가됩니다. –

+0

@ 이냐시오 : 네가 맞다고 생각해. 엔티티를 저장하기 전에 누군가 id 속성을 설정할 수 있습니다.이 경우 id는 None이 아닙니다. –

+0

@tomload : 해당 ID를 가진 항목이 이미 존재하는지 확인해야합니다 ... –

3

저장 방법을 무시하고 원하는 경우 super를 호출 할 수 없습니다. 이것은 이것을 달성하는 상당히 쉬운 방법 일 것입니다. 삭제 또는 업데이트는 단순히 반환하는 대신 발생을 시도하는 경우

# blatantly ripped the save from another answer, since I forgot to save original model 
def save(self, *args, **kwargs): 
    if self.id is None: 
     super(ModelName, self).save(*args, **kwargs) 

def delete(self, *args, **kwargs): 
    return 

아마 당신도 예외를 발생한다. 당신은 무슨 일이 일어나고 있는지를 사용자에게 알려주고 싶습니다 - 그 행동은 유효하지 않습니다.

+0

먼저 해당 모델의 인스턴스를 어떻게 만듭니 까? –

+0

예 ID 체크가 업데이트인지 저장인지 확인하는 것을 잊어 버렸습니다. 답변을 업데이트했습니다. –

+0

업데이트/삭제에 대한 예외를 throw하여 사용자에게 알리는 제안에 +1. –

3

은 : 당신의 주요 목표는 관리자에서 쓰기 액세스를 방지하는 경우 아무도 추가/변경 허가가되지 않도록, 당신은 사용 관리 클래스를 수정할 수 있습니다

class HistoryAdmin(admin.ModelAdmin): 

    def has_add_permission(self, request): 
     return False 

    def has_change_permission(self, request, obj=None): 
     return False 

    def has_delete_permission(self, request, obj=None): 
     return False 
+5

읽기 전용은 여전히 ​​읽기 전용임을 의미합니다. 변경 권한을 제거하면 더 이상 해당하지 않습니다. – webjunkie

1

만약 당신 돈 자동으로 실패하도록 레코드를 수정하려는 시도가 필요합니다.

def save(self, *args, **kwargs): 
    if self.pk: 
     (raise an exception) 
    super(YourModel, self).save(*args, **kwargs) 


def delete(self, *args, **kwargs): 
    (raise an exception) 
관련 문제