美文网首页
Django自定义Field(青铜版)

Django自定义Field(青铜版)

作者: 青铜搬砖工 | 来源:发表于2018-04-01 15:13 被阅读0次

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

    数据库数据

    image.png

    相关文章

      网友评论

          本文标题:Django自定义Field(青铜版)

          本文链接:https://www.haomeiwen.com/subject/gewocftx.html