GMeta

模型 GMeta 是类似Django Meta 的一种内置模型配置类,主要作用是用于增强模型的表达能力。

GMeta定义在Django 的Model 里面,如:

class Student(models.Model):
name = models.CharField('name', max_length=20)
create_time = models.DateTimeField('create_time', auto_now_add=True)
class GMeta:
title_field = "name"

GMeta有以下公开属性:

  1. title_field, 指定模型的标題字段。
  2. creator_field,指定模型的创建人字段。
  3. updater_field,指定模型的更新人字段。
  4. computed_fields,配置计算字段。
  5. annotated_fields,配置聚合字段
  6. exclude_fields,指定序列化时忽略的字段,通常用于类似密码类的字段。
  7. validators,模型级校验规则。

以下是详细说明:

title_field,标題字段#

声明在界面展示整个对象数据的时候,默认使用的字段。如在列表中显示一个ForeignKey对象,会输出该对象的title_field字段,否则默认输出该对象的主键值。作用类似于__str__函数。

如果不指定title_field,会默认使用模型的主键。

class Student(models.Model):
name = models.CharField('name', max_length=20)
...
class GMeta:
title_field = "name"

数据类型: string

取值范围:模型的物理字段名,或计算字段名。

creator_field,创建人字段#

声明创建者字段,该字段必须是用户类型的外键。作用是会自动使用当前登录的用户填充指定的字段,仅发生在数据的第一次保存时。类似DatetimeField的auto_now_add的功能。

class Student(models.Model):
...
create_user = models.ForeignKey(User)
class GMeta:
creator_field = 'create_user'

数据类型:字符串

取值范围:模型中用户类型的外键字段名。

注意:该配置将被弃用,它的功能将被UserField取代。

updater_field,修改人字段#

声明更新者字段,和creator_field是姐妹属性,要求的字段也是用户类型的外键,作用是会自动使用当前登录的用户填充指定的字段,发生在每一次数据的修改时。类似DatetimeField的auto_now的功能。

class Student(models.Model):
...
update_user = models.ForeignKey(User)
class GMeta:
updater_field = 'update_user'

数据类型:字符串

取值范围:模型中用户类型的外键字段名。

注意:该配置将被弃用,它的功能将被UserField取代。

computed_fields, 计算字段#

在模型内定义一个descritor方法,并将此方法通过computed_fields声明为计算字段供前端使用,这种字段称计算字段,仅可读。

例子:

@property
def display_stock(self):
"""显示库存,如果有sku,则为sku库存的总和
"""
skus = self.skus.all()
if skus:
return sum([sku.stock for sku in skus if sku.stock] or [0])
return self.stock
class GMeta:
computed_fields = [
{'name': 'display_stock', 'type': FieldType.INTEGER, 'display_name': '库存'}
]

数据类型:数组或无组,元素为dict,有如下属性:

  • name: 用于作为计算字段的函数名
  • display_name: 显示名,在列表、表单等Label处显示。
  • type: 该字段返回的数据类型。

annotated_fields, 聚合统计字段#

使用 Django 的 annotate聚合函数来计算当前模型的统计数值。

例子:

class GMeta:
annotated_fields = {
'distribution_num': {
'display_name': '分销收益次数',
'annotation': models.Count('walletbill'),
'type': FieldType.INTEGER,
}
}

数据类型: dict,key为字段名,value为该字段的参数,包括:

  1. display_name:显示名,在列表、表单等Label处显示。
  2. annotation: annotate表达式,必须是Django的聚合函数的表达式。
  3. type: 该字段返回的数据类型

exclude_fields,忽略字段#

给前端返回数据时,指定排除在外的字段。

例子:

class GMeta:
exclude_fields = ['password']

数据格式: list or tuple

validators,模型校验规则#

模型的全局校验规则,即非单个字段的校验,通常用于字段之间的关联校验,如开始时间不能大于结束时间这种校验。

数据类型:list of dict(只有一个校验规则时,可以为dict)。list的元素与dict的属性一样,包含:

  1. type, 校验类型
  2. field,校验字段名
  3. condition_field,依赖的条件字段名
  4. operator,条件字段比较符
  5. value,条件字段比较值
  • validator.type 校验类型

    数据类型: string 可选 ondition_required , condition_great , condition_less

    • ondition_required,有条件的必填

      条件字段的条件判断成立后,校验字段必填,如:

      validators = [
      ...
      # 优惠活动的类型(mode)是满减,那优惠金额(const)就必填
      {
      'type': 'condition_required',
      'field': 'cost',
      'condition_field': 'mode',
      'operator': '=',
      'value': 0
      }
      ]
    • condition_great

      校验字段值要比条件字段值大。

      validators = [
      ...
      # 活动结束时间要比活动开始时间大
      {
      'type': 'condition_great',
      'field': 'end_time',
      'condition_field': 'start_time',
      },
      ]
    • condition_less

      校验字段值要比条件字段值小,与上面 condition_great 相反

  • validator.field

    需要校验的字段名。

    数据类型:str

    取值范围:模型所有物理字段名

  • validator.condition_field

    满足条件的字段,即被用于比较的字段名。

    数据类型:str

    取值范围:模型所有物理字段名

  • validator.operator

    条件的操作类型,搭配 value 使用

    数据类型:str

    取值范围:

    • =,等于
    • >,大于
    • <,小于
    • in,在xx范围内
    • include,包含
  • validator.value

    条件字段需要满足的值。

    数据类型:同condition_field中指定的字段值类型。