Django学习之字段

字段类型及字段定义

Django中的字段可以引用已经写好的字段,利用这些已有的字段即可进行字段的定义,也可以自行去设计字段。
在重启server 时,django利用ORM方法来实现转换成SQL,最后去数据库中创建表和字段。

Django 中的字段类型有:

AutoField                  自增列 = int(11)
CharField                 字符串字段,max_length 参数
BooleanField              布尔类型=tinyint(1) 不能为空,lank=True
ComaSeparatedIntegerField  用逗号分割的数字=varchar
DateField                 日期类型 date
DateTimeField             日期类型 datetime
Decimal                   十进制小数类型 = decimal  必须指定整数max_digits和小数位decimal_places
EmailField                  字符串类型(正则表达式邮箱)
FloatField                  浮点类型 = double
IntegerField              整型
BigIntegerField            长整形
IPAddressField            字符串类型(ip4正则表达式)不再使用
GenericIPAddressField     字符串类型(ip4和ip6是可选的)
NullBooleanField          允许为空的布尔类型
PositiveIntegerFiel       正Integer
PositiveSmallIntegerField  正smallInteger
SlugField                 减号、下划线、字母、数字
SmallIntegerField         数字
TextField                 字符串=longtext
TimeField                 时间 HH:MM[:ss[.uuuuuu]]
URLField                  字符串,地址正则表达式
BinaryField               二进制
ImageField                  图片
FilePathField               文件

Odoo中的字段是限制,基于Odoo 10的字段,总共就那么几种,可以看源码:fields.py

字段类型:

SpecialValue        还没用过,继承自object
FailedValue         还没用过,继承自SpecialValue
MetaField           字段类的原类,继承自type
Field               继承自object
Boolean             Boolean,继承自Field
Integer             整数型,继承自Field
Float               浮点型,继承自Field
Monetary            货币型,继承自Field
_String             字符串型,继承自Field
Char                Char型,继承自_String
Text                Text型,长字符串,继承自_String
Html                HTML挂件使用,继承自_String
Date                日期型,继承自Field
Datetime            时间型,继承自Field
Binary              二进制型,继承自Field
Selection           Selection 型,继承自Field
Reference           引用字段,较为特殊
_Relational         关系型,继承自Field
Many2one            M2o字段,用于多对一关系
UnionUpdate         
_RelationalMulti    x2m的抽象字段
One2many            o2m字段,用于一对多关系
Many2many           M2m字段,用于多对多关系
Serialized          序列型,继承自Field
Id                  id,自增,继承自Field
Django的类及其字段的定义:
from django.db import models
class UseGroup(models.Model):
uid = models.AutoField(primary_key=True)   #主键,自增
caption = models.CharField(max_length=32,unique=True)   #唯一索引
ctime = models.DateField(auto_now_add=True,null=True)   #创建时生成时间
uptime = models.DateField(auto_now=True,null=True)      #更新时自动更新时间
Odoo的类及其字段的定义:
from odoo import api, fields, models, exceptions, _
class CostCenter(models.Model):
    _name = "cost.allocation.unit.costcenter"
    _description = "Kthrp Cost Allocation Unit Costcenter"

    costcenter_id = fields.Many2one(comodel_name='account.cost.center', string='Cost Center', required=True,
                                    domain=[('active', '=', True), ('type', '=', 'normal')])
    manage_classfication = fields.Selection(related='costcenter_id.manage_classfication', readonly=True,
                                            string='Manage Classfication')

字段的创建过程

Django的字段的创建过程

Django 中字段定义,在重启server 时,django利用ORM方法来实现转换成SQL,最后去数据库中创建表和字段。是重启后自动去生成SQL,创建更新表。

Odoo的字段的创建过程

odoo中字段定义,也是在重启后,会生成SQL,但是直到升级时,才去将执行SQL。

执行过程:

odoo中的init中的registry方法。

_load_data 、两个create(ir_model)、unlink(ir_model)和write(ir_model)
调用init_models

_load_data方法中的odoo.registry来执行调用init_models方法。

init_models 调用_auto_init

model._auto_init() 调用_auto_init

self._auto_init 调用_field_create

self._field_create() #执行UPDATE ,写入字段

而重启并不会直接生成SQL,执行SQL,等到点击升级才会去走registry方法。

点击升级后的操作:

button_immediate_install 调用_button_immediate_function

_button_immediate_function:

重置环境
更新registry,调用init方法
调用action_after_function