2011-08-14 3 views
2

Django 모델 내 모델 필드를 반복 실행하고 빈 문자열인지 확인하고 model save() 메서드의 null을 프로그래밍 방식으로 바꿉니다. 이는 일부 CharField가 고유하거나 값이 필요하지 않기 때문입니다.Django : 모델 필드의 빈 문자열을 None으로 자동 설정 하시겠습니까?

예 :

class Person(models.Model): 
    name = models.CharField(blank=True, unique=True, null=True) 
    nick_name = models.CharField(blank=True, unique=True, null=True) 
    ... 
    age = models.IntegerField() 

    def save(self, *args, **kwargs): 
     for field in self._meta.fields: # get the model fields 
      if field=='': 
       field = None 
     super(Person, self).save(*args, **kwargs) 

위의 내용이 값 대신 빈 문자열 필드 값을 비교하는 시도가 이루어집니다 이유는 명확하지 않은 creation_counter에 대해 불평.

이 수동으로 할 수 있지만, 내가 너무 많은 모델을 가지고 ....

어떤 제안이?

편집 : 나를 도우려는 모든 사람들에게 감사드립니다! : D

나에게 맞는 솔루션은 재즈가 게시하지만 그의 코드는 그의 게시물에 나타나지 않습니다. 이것은 본질적으로 동일하다 내 버전이지만, 별도의 검사와 필요에 있는지 우리는 재정의 할 :

귀하의 경우
from django.db.models.Field import CharField as _CharField 

class CharField(_CharField): 
    def get_db_prep_value(self, value, *args, **kwargs): 
     if self.blank == self.null == self.unique == True and value == '': 
      value = None 

     return super(CharField).get_db_prep_value(value, *args, **kwargs) 
+0

_meta.fields은 아마 모델 필드 이상이 포함되어 있습니다. 개별 필드에서이 작업을 성공적으로 시도해 보셨습니까? 또한 정확한 오류 메시지는 무엇입니까? – Ted

답변

6

, 나는 CharField을 하위 클래스와 보장 사용자 정의 모델 필드를 제안 빈 문자열은 None으로 변환됩니다. 덮어 쓰면 get_db_prep_value이됩니다.

class EmptyStringToNoneField(models.CharField): 
    def get_prep_value(self, value): 
     if value == '': 
      return None 
     return value 

class Person(models.Model): 
    name = EmptyStringToNoneField(blank=True, unique=True, null=True) 
    nick_name = EmptyStringToNoneField(blank=True, unique=True, null=True) 

https://docs.djangoproject.com/en/dev/howto/custom-model-fields/

+0

훌륭한 솔루션이라고 생각합니다. 내 코드를 대답으로 게시 할 것입니다. 편집 : 귀하의 게시물을 수정하려고 시도, 내 브라우저에서 전혀 나타나지 않는 코드를 게시했습니다. 나는 당신의 대답을 표시 할 것이지만, 나의 코드는 약간의 점검을한다. 내 게시물에 추가됩니다. – GoogleDroid

+0

URLField와 비슷한 기능이 필요하지만 verify_exist = True가 필요한 경우 어떻게 할 것입니까? 나는 .. 빈 URL에 대한 URL 유효성 검사가 필요하지 않습니까? 양식이 복잡하기 때문에 조금 복잡해지며 자체 유효성 검사가 수행됩니다. – GoogleDroid

+0

이 경우'blank = True' ;-)와 같은 코드를 사용하십시오! – jazz

0

재즈의 대답은 나를 위해 마법처럼 작동합니다.

새 마이그레이션 필드에인트로 스펙 규칙을 지정하지 않으면 South 마이그레이션 도구를 사용하는 경우 schemamigration 명령이 실패합니다.

"간단한 필드"의 경우 필드가 지정된 곳마다 다음 코드를 간단히 추가 할 수 있습니다.

from south.modelsinspector import add_introspection_rules 
add_introspection_rules([], ["^myapp\.stuff\.fields\.SomeNewField"]) 

이제 남한으로 이전해야합니다.

참고하시기 바랍니다.

참조 : http://south.aeracode.org/wiki/MyFieldsDontWork

관련 문제