2011-11-02 9 views
30

나는 (도 말씀이 언어를 가지고있는 모델)이 비슷한 ManyToManyField있는 모델을 가지고 :장고 ManyToMany 모델 검증

class Sentence(models.Model): 
    words = models.ManyToManyField(Word) 
    language = models.ForeignKey(Language) 
    def clean(self): 
     for word in self.words.all(): 
      if word.language_id != self.language_id: 
       raise ValidationError('One of the words has a false language') 

새로운 문장을 추가하려고 (예 : 장고 관리를 통해) I 'Sentence' instance needs to have a primary key value before a many-to-many relationship can be used을 얻으십시오. 즉, 저장하기 전에 self.words에 액세스 할 수 없다는 것을 의미합니다.하지만 이것은 정확하게 수행하려고 시도한 것입니다. 그럼에도 불구하고이 모델을 검증 할 수있는 방법이 있습니까? 모델의 필드를 직접 확인하고 싶습니다.

이 예외와 관련된 많은 질문이 있지만 문제에 대한 도움을 찾을 수 없습니다. 나는 어떤 제안을 주셔서 감사합니다!

+0

단어를 만들고 싶다면 단어가 문장과 연결되어 있다는 것을 어떻게 확인할 것입니까? 모델 정의에 '문장'필드가 없습니다. – johnklawlor

+0

모두가 양식을 사용하지 않습니다. 나는 이것이 장고의 엄청난 결함이라고 생각한다. 누구든지 더 좋은 대답을 가지고 있습니까? –

답변

44

모델의 clean 메서드에서이 유효성 검사를 수행 할 수는 없지만 words의 유효성을 검사 할 수있는 모델 양식을 만들 수 있습니다.

from django import forms 

class SentenceForm(forms.ModelForm): 
    class Meta: 
     model = Sentence 

    def clean(self): 
     """ 
     Checks that all the words belong to the sentence's language. 
     """ 
     words = self.cleaned_data.get('words') 
     language = self.cleaned_data.get('language') 
     if language and words: 
      # only check the words if the language is valid 
      for word in words: 
       if words.language != language: 
        raise ValidationError("The word %s has a different language" % word) 
     return self.cleaned_data 

그런 다음 장고 관리자에서 양식을 사용하려면 Sentence 모델 관리 클래스를 정의 할 수 있습니다.

class SentenceAdmin(admin.ModelAdmin): 
    form = SentenceForm 

admin.register(Sentence, SentenceAdmin) 
+6

모델에서 직접 유효성을 검사 할 가능성이 없다는 것을 아는 것이 유감입니다. 그러나 지금까지는 사용자 정의 ModelForm만으로 충분합니다. 답변 주셔서 감사합니다! – purefanatic

+0

또한 문장 형식을 다른 모델 (예 : 단락)에서 인라인으로 볼 수있는 경우 SentenceInline 클래스에도'form = SentenceForm' 줄을 추가 할 수 있습니다. –

+0

@purefanatic'Model.save()'는'ValidationErrors'를 발생시키지 않을 것이므로 직접 유효성을 검사 할 방법이 없습니다. – jnns

1

모델의 clean 메서드에서 수행 할 수 없습니다. Django에서 M2M 관계가 작동하는 방식으로는 불가능합니다. 그러나 관리자 또는 사이트의 양식과 같이 Sentence을 만드는 데 사용되는 양식에 대해 이러한 종류의 유효성 검사를 수행 할 수 있습니다.