def to_python(self, value):
if value is None:
return value # 如果返回了就不执行后续的代码了,如果不满足value is None,就继续执行下面的代码
if isinstance(value, datetime.datetime):
return value
if isinstance(value, datetime.date):
value = datetime.datetime(value.year, value.month, value.day)
if settings.USE_TZ:
# For backwards compatibility, interpret naive datetimes in
# local time. This won't work during DST change, but we can't
# do much about it, so we let the exceptions percolate up the
# call stack.
warnings.warn("DateTimeField %s.%s received a naive datetime "
"(%s) while time zone support is active." %
(self.model.__name__, self.name, value),
RuntimeWarning)
default_timezone = timezone.get_default_timezone()
value = timezone.make_aware(value, default_timezone)
return value
try:
parsed = parse_datetime(value) # 这里可以看出如果输入是字符串,那么上面的if都不满足,则会自动解析这个字符串,看是否满足时间格式
if parsed is not None:
return parsed
except ValueError:
raise exceptions.ValidationError(
self.error_messages['invalid_datetime'],
code='invalid_datetime',
params={'value': value},
)
try:
parsed = parse_date(value)
if parsed is not None:
return datetime.datetime(parsed.year, parsed.month, parsed.day)
except ValueError:
raise exceptions.ValidationError(
self.error_messages['invalid_date'],
code='invalid_date',
params={'value': value},
)
raise exceptions.ValidationError(
self.error_messages['invalid'], # 这里用到了self参数,相当于this,但java中this是不需要定义的,python中self需要定义
code='invalid',
params={'value': value},
)
https://docs.djangoproject.com/en/2.0/_modules/django/db/models/fields/#DateTimeField
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。
class SubClassName (ParentClass1[, ParentClass2, ...]): 'Optional class documentation string' class_suite
class DateTimeField(DateField):
说明DateTimeField的父类是DateField