内置字段

lightning支持Django内置的大部份字段,另外还增加了以下字段,为开发时获得较大的便利:

  1. ImageURLField,图片链接字段。
  2. FileURLField,文件链接字段。
  3. RichTextField,富文本字段。
  4. TimestampField,时间戳字段。
  5. ObjectField,对象字段。
  6. ArrayField,数组字段。

这些字段均可以从lightning.fields 模块中import进来,如:

from lightning.fields import ImageURLField

ImageURLField,图片链接字段#

from lightning.fields import ImageURLField
class XX:
image = ImageURLField()

使用ImageURLField,在Admin的前端会默认使用图片预览器用于查看、使用图片上传组件用于新增。存储引擎使用系统设置的引擎。

FileURLField,文件链接字段#

from lightning.fields import FileURLField
class YY:
attachment = FileURLField()

使用FieldURLField,在Admin的前端会默认使用文件预览器用于查看下载、使用文件上传组件用于新增。存储引擎使用系统设置的引擎。

RichTextField,富文本字段#

from lightning.fields import RichTextField
class Article:
content = RichTextField()

RichTextField,继承于TextField,在Admin的前端会默认使用富文本编辑器(CKEditor)来编辑该字段。

TimestampField,时间戳字段#

from lightning.fields import TimestampField
class Article:
ts = TimestampField(auto_now=True)

时间戳字段,继承于BigIntegerField,允许以时间戳的格式存储时间信息。对于遗留系统可以使用该字段,新的模型建议使用DateTimeField以获得更丰富的特性。

ObjectField,对象字段#

对象字段,用于存储单个复杂对象,类似dict。该字段需要传递一个object_model参数,该参数的值应为一个ObjectModel的子类,在该子类内,像定义Django Model一样定义属性即可,例,定义一个地理位置的类型,以ObjectField的形式存储于Contact的模型内:

from django.db import models
from lightning.fields import ObjectField
from api_basebone.core.object_model import ObjectModel
class Position(ObjectModel):
latitude = models.DecimalField(...)
longitude = models.DecimalField(...)
class Contact(models.Model):
position = ObjectField(Position)
...

ObjectField的访问,直接通过.访问即可:

contact = Contact.objects.get(pk=1)
print(contact.position.latitude)

在前端编辑界面中,ObjectField对应一个独立的弹窗表单编辑器。

ObjectModel与Django Model的区别是,前者无对应的存储表,只会以JSON格式存储在使用它的父模型的表中。

ObjectField支持嵌套,即其ObjectModel内可以使用ObjectField字段。

ArrayField,数组字段#

与ObjectField的性质类似,它用于存储多个对象,但这个对象可以是ObjectModel类型的复杂对象,也可以是普通类型的数据,如str, int, bool等。例:

from django.db import models
from lightning.fields import ArrayField
from api_basebone.core.object_model import ObjectModel
class Position(ObjectModel):
latitude = models.DecimalField(...)
longitude = models.DecimalField(...)
class Contact(models.Model):
positions = ArrayField(Position)
...

ArrayField的值是一个list,可直接迭代或下标访问:

contact = Contact.objects.get(pk=1)
for pos in contact.positions:
print(pos.latitude)

在前端编辑界面中,ObjectField对应一个内嵌的多行编辑器。

如ObjectField一样,ArrayField也是支持嵌套,同时也支持与ObjectField互相嵌套。