2

모델 '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()과 같을 것이라고 생각했다.

+0

정말 성취하려는 것은 무엇입니까? 왜 장고에 대한 업데이트 대 삽입 동작을 즐기고 있습니까? pre_save를 엉망으로 만드는 이유는 거의 없습니다. 너 정말로 무엇을하려고하는거야? –

+1

제목에서 SlugField를 생성하려고합니다.업데이트 인 경우 새 슬러그를 생성하지 않아야합니다. – Matt

+0

@Matt : 질문을 새로운 사실로 업데이트하십시오. 당신은 이것을 위해 pre_save를 망칠 필요가 없습니다. save()를 재정의하십시오. –

답변

1

S.Lott 올바른 ... 사용 save(), 당신이 이미 시작한 것을 인정 했으므로.

신호 질문에 관해서는 솔직하게 당신의 코드에 아무런 이상이없는 것을 볼 수 있습니다. 나는 심지어 그것을 로컬로 성공으로 성공 시켰습니다. 당신이 질문에서 제대로 표현하고 있다고 확신합니까? 또는 instance2가 이미 기존 데이터베이스 객체 (테스트 코드의 어쩌면)가 아닐까요?

+0

이것을 manage.py 쉘에서 테스트 해 보았습니다. >>> from testing.models 가져 오기 테스트 >>> t1 = 테스트 (제목 = "테스트 제목") >>> t1.save() >>> t1.slug '은 시험 제목 "= 시험 >>> T2 (제목 ="시험 제목 ") >>> t2.save() >>> t2.slug 는' – Matt

+0

와우, 추한. 흠, 코드를 살펴보고 실수를했는지 확인합니다. – Matt

+0

방금 ​​"prepopulate_from"을 발견했습니다 ... 어떤 버전의 django를 사용하고 있습니까? "Generate Slug Code"의 코드는 무엇입니까? –

0

게시 해 주셔서 감사합니다. 상단 google 결과 (내가 이것을 게시 할 때)는 약간 구식이며 이전에 신호를 연결하는 방법을 보여줍니다 (최근 재 작성되었습니다.). 수정 된 코드 스 니펫을 사용하여 수정 한 내용이 나에게 표시되었습니다.

더 많은 포스터가 의견을 편집하여 수정 사항을 적용 해 주시기 바랍니다. 감사. :-)