当Django提供的Field无法满足我们的需求时,可以通过自定义Field来解决这个问题。
每个自定义的Field,都需要继承django.db.models.Field
,
- 如果mysql有相应的字段,则直接设置
db_field
属性即可,如下文的SmallIntegerField
字段。 - 如果mysql没有相应的字段,则需要重写父类的
from_db_value
方法,to_python
方法,get_prep_value
方法。如下文的PasswordFieldCustom
字段。
CustomField.py文件
from django.db.models.fields import Field,CharField
from django.contrib.auth.hashers import make_password,check_password
from django.utils import six
class SmallIntegerField(Field):
db_field = 'smallint'
class PasswordFieldCustom(Field):
def from_db_value(self, value,expression, connection,context):
return value
def to_python(self, value):
return value
def get_prep_value(self, value):
if isinstance(value, six.string_types) or value is None:
return make_password(value, None, 'pbkdf2_sha256')
return '55555'
models.py文件
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from .CustomFields import TimeStampField,SmallIntegerField,PasswordFieldCustom
from django.db import models
# Create your models here.
class TestModel(models.Model):
# timestamp = TimeStampField()
userid = SmallIntegerField()
password = PasswordFieldCustom(default='12333333',max_length=1000)
class Meta():
verbose_name ='test'
verbose_name_plural =verbose_name;
数据库中创建出来的表
image.png-
db_field
指明数据库列的类型 -
from_db_value
方法返回从数据库中取出数据。 -
to_python
方法把数据写入数据库 -
get_prep_value
方法是与to_python
方法共同使用,作用为将Python对象进行处理,确保数据库可以保存其对象。(如果不写这个方法,无法调用to_python,所以用to_python时一定要写get_prep_value)
testModel.py
import os,django
from django.contrib.auth.hashers import make_password,check_password
from users.models import TestModel
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "CustomFieldTest.settings")# project_name 项目名称
django.setup()
user =TestModel()
user.userid =1238;
user.password ='1'
user.save()
user1 = TestModel.objects.get(userid='1238')
check_password('1',user1.password)
print(check_password('1',user1.password))
网友评论