** 2015 년 11 월 30 일 편집 : Python 3에서는 모듈 전역 __metaclass__
변수가 더 이상 지원되지 않습니다 . Additionaly은, 현재의 클래스했다 되지 않습니다 :Django 1.10
SubfieldBase
로부터 문서 :
django.db.models.fields.subclassing.SubfieldBase
더 이상 사용되지 않으며 Django 1.10에서 제거됩니다. 역사적으로 데이터베이스에서로드 할 때 유형 변환이 필요한 필드를 처리하는 데 사용되었지만 .values()
호출 또는 집계 에는 사용되지 않았습니다 . 로 교체되었습니다 from_db_value()
.
새로운 접근 방식to_python()
은의 경우와 같이 할당시 메소드 를 호출하지 않습니다SubfieldBase
.
따라서 from_db_value()
설명서 및이 예제 에서 제안한대로이 솔루션은 다음과 같이 변경해야합니다.
class CharNullField(models.CharField):
"""
Subclass of the CharField that allows empty strings to be stored as NULL.
"""
description = "CharField that stores NULL but returns ''."
def from_db_value(self, value, expression, connection, contex):
"""
Gets value right out of the db and changes it if its ``None``.
"""
if value is None:
return ''
else:
return value
def to_python(self, value):
"""
Gets value right out of the db or an instance, and changes it if its ``None``.
"""
if isinstance(value, models.CharField):
# If an instance, just return the instance.
return value
if value is None:
# If db has NULL, convert it to ''.
return ''
# Otherwise, just return the value.
return value
def get_prep_value(self, value):
"""
Catches value right before sending to db.
"""
if value == '':
# If Django tries to save an empty string, send the db None (NULL).
return None
else:
# Otherwise, just pass the value.
return value
관리자에서 cleaned_data를 재정의하는 것보다 더 나은 방법은 charfield를 서브 클래 싱하는 것입니다. 어떤 방식으로 필드에 액세스하든 "그냥 작동합니다." 당신은 잡을 수 ''
가 데이터베이스로 전송되기 직전에, 그리고 데이터베이스에서 나온 직후 NULL을 잡아, 그리고 장고의 나머지 / 치료를 알 수 없습니다. 빠르고 더러운 예 :
from django.db import models
class CharNullField(models.CharField): # subclass the CharField
description = "CharField that stores NULL but returns ''"
__metaclass__ = models.SubfieldBase # this ensures to_python will be called
def to_python(self, value):
# this is the value right out of the db, or an instance
# if an instance, just return the instance
if isinstance(value, models.CharField):
return value
if value is None: # if the db has a NULL (None in Python)
return '' # convert it into an empty string
else:
return value # otherwise, just return the value
def get_prep_value(self, value): # catches value right before sending to db
if value == '':
# if Django tries to save an empty string, send the db None (NULL)
return None
else:
# otherwise, just pass the value
return value
내 프로젝트의 경우이 extras.py
파일을 내 사이트의 루트에 있는 파일에 덤프 한 다음 from mysite.extras import CharNullField
내 앱 models.py
파일 에 넣을 수 있습니다 . 필드는 CharField처럼 작동 blank=True, null=True
합니다. 필드를 선언 할 때 설정 해야합니다. 그렇지 않으면 Django가 유효성 검사 오류 (필수 필드)를 발생 시키거나 NULL을 허용하지 않는 DB 열을 만듭니다.
def get_db_prep_value(self, value, connection, prepared=False)
메소드 호출로 필요할 것 입니다. 자세한 내용은 groups.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ 를 확인 하십시오. 다음 방법도 나에게 효과적입니다. 값을 전달