2013-02-25 4 views
0


확인 :장고 - 내가 장고에 간단한 모델을 정의 모델 필드 형식

class Student(models.Model): 
    s_name = models.CharField(max_length=32) 
    s_gpa = models.FloatField(min=0.0, max=5.0, default=5.0) 
    s_year = models.IntegerField(min=1, max=10, default=1) 
    s_registered = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return self.username 

    def modify(self, **kwargs): 
     if valid(self, kwargs): 
      for k,v in kwargs.iteritems(): 
       setattr(self, k, v) 
      self.save() 

def valid(s, kwargs): 
    # For all k,v pairs in kwargs 
    # (1) Checks if k is one of the attributes of s. Returns False if fails. 
    # (2) Checks if v fits the format defined for attribute k of s. 
    # Returns False if fails. 
    # Returns True if reaches this point. 

은 내가 코멘트에 설명 된 명령을 실행하고 싶은 유효한 기능을 쓰고 있어요. 를 들어
(1)
, 나는 와 도움이 필요

if k not in s.__dict__: return False 

를 사용 (2).
값이 속성 (Django 모델 필드)에 대해 정의 된 형식에 맞는 지 어떻게 확인할 수 있습니까?

예 : valid (s_name = True) 및 valid (s_name = 33 * 'a')는 모두 False를 반환해야합니다.

참고 : 양식을 사용하지 않고이 유효성 검사를 해결하려고합니다.

+0

를 - 그것은 첫 번째 인수로 '자기'를 사용하는 것이 일반적이다 귀하의 방법에 - http://www.python.org/dev/peps/pep-0008/#function-and-method-arguments –

+0

그것을 지적 해 주신 Aidan.사실, 제 의도는 학생과 독립적 인 유효한 것입니다. 별도의 유틸리티 모듈에서 가져옵니다. 제가 학생의 정의 안에 남겨 두었던 것은 사고였습니다. 내 관심을 불러 주셔서 다시 한번 감사드립니다. –

+0

나는 그것이 그 길을 확신하지 못했습니다. 업데이트 된 답변을 살펴보고 모델 유효성 검사 문서를 한눈에 볼 수 있습니다. –

답변

1

모두 당신의 validmodify 기능은 아마 clean 방법으로 교체해야합니다.

당신은 아마 모두 유효한 방법을 삭제하고 대신 단순 self.clean_feilds()를 호출 할 수 model validation

UPDATE 1

에 문서에서보세요. 즉, 필드 유효성을 검사합니다 -

def modify(self, **kwargs): 
    try: 
     self.clean_fields() 
     for k,v in kwargs.iteritems(): 
      setattr(self, k, v) 
     self.save() 
    except: 
     pass 

업데이트 2

그것은 당신이 전혀 검증 자신을 호출 할 필요는 없습니다 귀하의 의견에서 소리가 난다. save으로 전화 한 다음 변경 사항이 유효하지 않은 경우 ValidationError을 잡습니다.

def modify(self, **kwargs): 
    try: 
     for k,v in kwargs.iteritems(): 
      setattr(self, k, v) 
     self.save() 
    except ValidationError: 
     #... do something? 

그것은 많은 파이썬 프로그래머가 패턴/유효 다음의 경우를 제외하고 /를 시도 선호 주목할 가치가있다. '허가보다 용서를 구하는 것이 더 낫다'는 원칙 (이 경우 경쟁 조건에 대한 보호를 제공하는 것 - 아마도이 경우 관련 없음)으로 알려져 있습니다.

+0

좋은 답변입니다. 가장 간결 해 보입니다. 위의 질문에서 실제로 질문 한 기능처럼 들리지 않는 개별 필드를 테스트 할 수있는 방법을 제공하려고했습니다. – Cole

+0

당신이 말하는 것을 볼 것 같아요. 따라서 self.clean_fields()를 호출하면 Student 인스턴스 (self)를 사용하고 필드를 검증하고 무언가가 유효하지 않으면 예외가 발생합니다. 귀하의 예제에서, 그러나, 우리는 먼저 setattr을 사용하여 kwargs에 루프를 호출해서는 안되며, 그런 다음 그 사람의 새로운 모습에 대해 clean_fields를 호출해야합니까? 청소가 예외를 발생시키지 않는 경우에만 self.save()를 호출하십시오. –

+0

필드 유효성을 검사하고 속성을 설정한다고 생각했습니다 (코드에서). 필요하다면 속성을 추가 한 후 (그러나 저장하기 전에) self.full_clean으로 다시 검증 할 수 있습니다. –

0

필요에 따라 s 또는 self을 사용하십시오.

def valid(self, kwargs): 
    for k, v in kwargs: 
     old_v = self.__dict__[k] 
     self.__dict__[k] = v 
     try: 
      self.save() 
      self.__dict__[k] = old_v 
      self.save() 
     except: 
      return False 

     return True 

가능성이 실제 'self.save() 실패보다 테스트를 수행 할 수있는보다 직접적인 방법이 있지만 좋은 장소가 시작합니다. 또한

:

지능형리스트와
field_list = ['s_name', 's_gpa', 's_year', 's_registered'] 
def valid(self, kwargs): 
    for k, v in kwargs: 
     exclude_list = [f for f in field_list if f != k] 
     try: 
      self.clean_fields(exclude=exclude_list) 
     except ValidationError: 
      return False 

     return True 

exclude_list 라인을 제거하고에 self.clean_fields 라인 변경 : 제쳐두고

self.clean_fields(exclude=[f for f in field_list if f != k]) 
관련 문제