Django自定义Field(青铜版)

当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;

数据库中创建出来的表

Django自定义Field(青铜版)_第1张图片
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))

数据库数据

Django自定义Field(青铜版)_第2张图片
image.png

你可能感兴趣的:(Django自定义Field(青铜版))