Django model 재 작성 save 방법 및 update 밟 기 자세 한 설명
Django 에서 데이터베이스 에 저 장 된 데 이 터 를 검증 하려 면 어떤 방법 이 있 습 니까?
저 희 는 view 에서 처리 할 수 있 습 니 다.view 가 요청 을 받 을 때마다 제출 한 데 이 터 를 검사 할 수 있 습 니 다.검 사 는 오 류 를 직접 되 돌려 주지 않 고 데이터 베 이 스 를 쓰 지 않 습 니 다.검 사 는 create 나 update 방법 으로 데이터 베 이 스 를 다시 호출 합 니 다.
상기 방식 은 비교적 간단 하고 이해 하기 쉬 우 나 이에 따라 번 거 로 움 을 가 져 왔 습 니 다.우 리 는 모든 데 이 터 를 받 는 곳 에서 검 사 를 해 야 합 니 다.그러면 더욱 우아 한 방식 이 있 습 니까?"Django 는 Signals 를 사용 하여 model 필드 의 변 화 를 모니터링 하여 알림 을 보 냅 니 다"라 는 이전 글 을 보 셨 다 면 signals 신 호 를 통 해 처리 할 수 있 고 pre 를 추가 할 수 있 을 것 이 라 고 생각 하 실 수 있 습 니 다.save 의 신 호 는 데이터베이스 데이터 가 변경 되 기 전에 pre 를 터치 합 니 다.save 방법 은 view 의 여러 곳 에서 검사 하 는 번 거 로 움 을 없 앨 수 있 습 니 다.
오늘 말 하고 자 하 는 것 은 signals 가 아니 라 다른 일반적인 방법 입 니 다.model 을 다시 쓰 는 save 방법 입 니 다.
다시 쓰기 save 방법
save 방법의 주요 역할 은 대상 을 데이터베이스 에 저장 하 는 것 이다.만약 우리 가 데이터 가 입고 되 기 전에 처 리 를 하고 싶다 면,위 에서 언급 한 signals 를 제외 하고,save 방법 을 다시 써 서 실현 할 수 있다.구체 적 인 실현 방식 은 아래 의 이 예 를 본다.
만약 우리 가 model 을 다음 과 같이 정의 한다 면:
class TempTask(models.Model):
...
exechost = models.CharField(max_length=64, default='localhost', verbose_name=' ')
execuser = models.ForeignKey(ExecUser, null=True, on_delete=models.PROTECT, db_constraint=False)
exechost 는 기본적으로 Localhost 이 고 execuser 는 기본적으로 비어 있 습 니 다.기 존 요구 사항:exechost 가 localhost 가 아 닐 때 ip:port 형식 에 부합 해 야 합 니 다.execuser 가 비어 있 으 면 안 됩 니 다.이것 은 비교적 복잡 한 검사 방식 으로 우 리 는 save 방법 을 다시 써 서 처리 할 수 있다.
class TempTask(models.Model):
...
def save(self, *args, **kwargs):
if self.exechost and (self.exechost.strip() != 'localhost'):
if len(self.exechost.split(':')) != 2:
raise ValidationError(' , ip:port ')
if not self.execuser:
raise ValidationError(' ')
super().save(*args, **kwargs)
저 희 는 save 함수 에서 다양한 사용자 정의 논 리 를 실행 할 수 있 습 니 다.그러나 주의해 야 할 것 은 마지막 으로 슈퍼().save()방법 을 사용 하여 부모 류 의 save()를 실행 해 야 데이터 베 이 스 를 기록 할 수 있 습 니 다.이렇게 하면 create 문 구 를 실행 하여 데 이 터 를 삽입 할 때 save 의 검증 방법 을 먼저 실행 하여 검증 합 니 다.
TempTask.objects.create(**postdata)
갱 을 밟다
모든 것 이 끝나 야 한다 고 생각 하고 일어나 커피 를 타 려 고 할 때 새로운 데 이 터 를 추가 하면 정상적으로 검사 할 수 있 지만 데 이 터 를 업데이트 하면 안 됩 니 다.업 데 이 트 된 코드 는 다음 과 같 습 니 다.
TempTask.objects.filter(id=pk).update(**postdata)
한 번 의 검색 을 통 해 문제 의 소 재 를 발 견 했 는데,공식 문서 에 이런 말 이 있 었 다.
Unfortunately, there isn't a workaround when creating or updating objects in bulk, since none of save(), pre_save, and post_save are called.
즉,검색 집합 을 사용 하여 대상 을 대량으로 업데이트 할 때 모든 대상 에 게 save()방법 을 호출 하지 않 고 presave 와 postsave 도 호출 되 지 않 습 니 다.save()와 유사 한 것 은 model 의 delete()방법 도 있 습 니 다.대량으로 삭제 할 때 model 의 delete()방법 을 사용 하지 않 지만 delete 는 pre 를 사용 할 수 있 습 니 다.delete 또는 postdelete 신호 의
이 문 제 를 해결 하 는 방법 은 매우 간단 하 다.그것 은 바로 업 데 이 트 된 코드 를 아래 와 같이 바 꾸 어 save 방법 으로 호출 하 는 것 이다.
_t = TempTask.objects.get(id=pk)
_t.__dict__.update(**postdata)
_t.save()
추가 지식:django model save 방법 은 변경 되 지 않 은 필드 를 저장 합 니 다.코드 보 세 요~
obj = Obj.objects.get(id=1)
print obj.name # name 'abc'
def handler(oid):
obj = Obj.objects.get(id=oid)
obj.name = '123'
obj.save()
handler(obj.id)
obj.age = 10
obj.save()
print obj.name
최종 name 결 과 는 여전히 abc 입 니 다.save()를 저장 할 때 다른 필드 는 변경 되 지 않 았 지만 메모리 의 값 을 데이터베이스 에 다시 저장 합 니 다.하위 함수 와 다른 프로 세 스 가 변경 한 값 은 덮어 씁 니 다.이상 의 Django model 재 작성 save 방법 및 update 밟 기 자세 한 설명 은 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.많은 응원 부탁드립니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.