Django下models自定义Field的使用

一、自定义Field介绍

在上一个博客中简单罗列了一下Django下models常用的Field,但是有时候这些Field不能满足我们的存储数据的需求,这个时候我们就可以使用自定义Field

二、自定义Field编写

具体思路是基于原有的Field,自定义Field首先去继承原有的Field,然后进行重写

需要重写明确以下几点:

第一、需要继承的models下的原有Field

第二、明确自己想要存储什么样的数据

第三、编写父类的__init__

第四、重写父类的to_python函数(将数据库内容转化为python对象)

第五、重写父类的get_prep_value函数(将python对象保存到数据库中,用于objects.create插入数据)

第六、重写父类的value_to_string函数(将python对象转为字符串,用于objects.get查询并输出数据)

具体代码如下:

from django.db import models

# 自定义Field
class MyField(models.TextField):
    # 自定义Field主体内容
    # 以存储列表数据为例
    def __init__(self,*args,**kwargs):
        super(MyField,self).__init__(*args,**kwargs)     #调用父类初始化
    # 重写父类方法
    # 自定义Field001--将数据库内容转化为python对象
    def to_python(self,value):
        if not value:
            value=[]
        if isinstance(value,list):
            return value
        return value
    # 自定义Field002--将python对象保存到数据库中,用于objects.create插入数据
    def get_prep_value(self, value):
        if value is None:
            return value
        return str(value)   #强行转为字符串再写入数据库
    # 自定义Field003--python对象转为字符串,用于objects.get查询数据
    def value_to_string(self, obj):
        value=self._get_val_from_obj(obj)
        return self.get_db_prep_value(value)

三、创建自定义Field对应的数据库 

针对上面的自定义Field,我们需要创建与之对应的数据库,并设置数据字段以及查询数据输出的格式

# 创建表来使用自定义字段类型
class Testmyfield(models.Model):
    myid=models.IntegerField()
    contents=MyField()
    # 设置返回数据库数据的格式
    def __str__(self):
        return '{},{}'.format(str(self.myid),str(self.contents))

四、自定义Field调试

在编写完毕自定义Field之后,我们需要进行调试,看是否能存储数据以及查询数据

1、调试存储数据

第一,在Terminal或者cmd中先进入到django项目目录当中

第二,输入python manage.py shell进入python的ide

第三,导入models下的自定义类数据库

第四、输入命令:自定义类数据库.objects.create(参数)

>>> from bbs.models import Testmyfield
>>> Testmyfield.objects.create(myid=2,contents=['hello','hi','python'])
<Testmyfield: 2,['hello', 'hi', 'python']>

2、查询存储数据 

第一,在Terminal或者cmd中先进入到django项目目录当中

第二,输入python manage.py shell进入python的ide

第三,导入models下的自定义类数据库

第四,输入命令:自定义类数据库.objects.get(查询条件)

>>> from bbs.models import Testmyfield
>>> Testmyfield.objects.get(myid=2)
<Testmyfield: 2,['hello', 'hi', 'python']>

猜你喜欢

转载自blog.csdn.net/BearStarX/article/details/84958189
今日推荐