모델 'pre_save'신호에 연결하는 함수를 만들었습니다.Django Model.object.get pre_save 함수 기괴함
sender.objects.get(pk=instance._get_pk_val())
모델의 첫 번째 인스턴스는 오류가 발생합니다 : 함수 내부에서 나는 모델 인스턴스의 PK가 이미있는 테이블에 존재하는지 확인하기 위해 노력하고 있습니다. 나는 오류를 잡아서 제목에서 슬러그 필드를 생성한다. 두 번째 인스턴스에서는 오류가 발생하지 않습니다. 나는 두 경우에 instance._get_pk_val()의 값을 확인하지 그들은 동일합니다 : 없음
그래서:
# This one raises an error in the sluggit function
instance1 = Model(title="title 1")
instance1.save()
# This one doesn't raise an error
instance2 = Model(title="title 2")
instance2.save()
이 내 3 일 파이썬과 장고와 장난된다. 그래서 내가보기 싫은 새로운 것이면 미안합니다.
편집 :
모델 :
class Test(models.Model):
title = models.CharField(max_length=128)
slug = models.SlugField(max_length=128)
slug.prepopulate_from=('title',)
signals.pre_save.connect(package.sluggit, sender=Test)
기능 기본 사항 : S.Lot @
def sluggit(sender, instance, signal, *args, **kwargs):
try:
sender.objects.get(pk=instance._get_pk_val())
except:
# Generate Slug Code
는 코멘트에 저장() 메소드를 오버라이드 (override) 나에게 말했다. 나는 그것을 시험해야 할 것이다. 여전히 model.objects.get()에 대한 두 번째 호출이이 메서드로 오류를 발생시키지 않는 이유를 알고 싶습니다.
편집 2 고맙습니다 @ S.Lot. save 메소드를 오버라이드 (override)하면 (자) 완전하게 기능합니다. 신호 방법에 대해 아직도 궁금합니다. 흠, 이상 하네.
def sluggit(sender, instance, signal, *args, **kwargs):
try:
sender.objects.get(pk=instance._get_pk_val())
except:
# Generate Slug Code
요구로 :
편집 3 좀 더 주위를 연주 후, 나는() 대신 sender.objects.get의) instance.objects.get를 (사용하여 작동하는 것을 발견
def sluggit(sender, instance, signal, *args, **kwargs):
try:
instance.objects.get(pk=instance._get_pk_val())
except:
# Generate Slug Code
버그? 어떤 이유로 나는 sender.objects.get()이 Test.objects.get()과 같을 것이라고 생각했다.
정말 성취하려는 것은 무엇입니까? 왜 장고에 대한 업데이트 대 삽입 동작을 즐기고 있습니까? pre_save를 엉망으로 만드는 이유는 거의 없습니다. 너 정말로 무엇을하려고하는거야? –
제목에서 SlugField를 생성하려고합니다.업데이트 인 경우 새 슬러그를 생성하지 않아야합니다. – Matt
@Matt : 질문을 새로운 사실로 업데이트하십시오. 당신은 이것을 위해 pre_save를 망칠 필요가 없습니다. save()를 재정의하십시오. –