通用数据(简单数据)
在大部分的业务类型的model中,有的type,status,priority等field,比如产品的类型,项目的类型,需求的类型,项目的状态,优先级等等。这些数据一般都是可设置项,并且用户可以自定义这些数据。原来是不同的model里的type,status或priority,单独定义一个model,导致后面这种model越来越多。这些model一般都很简单,总结这些model的共性后,将这些model都统一为一个model。
class SimpleData(BaseModel):
name = models.CharField('名称', max_length=32,blank=False,default='', null=True,unique=False)
code = models.CharField('代号', max_length=32,blank=False,default='', null=True,unique=False,validators=[alpha_numeric_underline])
bgcolor = models.CharField('背景色', max_length=16,blank=True,default='', null=True,unique=False)
color = models.CharField('前景色', max_length=16,blank=True,default='', null=True,unique=False)
systemCreated = models.BooleanField("系统创建",blank=True,default=False)
creater = models.ForeignKey(
User, on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='创建者', related_name='simpleDatas_created')
updater = models.ForeignKey(
User, on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='更新者', related_name='simpleDatas_updated')
dataType = models.CharField(max_length=32,choices=DatayType_enum.choices,default=DatayType_enum.priority.value)
dataType
最重要的就是这个,用于指定是什么数据。这是一个枚举值
class DatayType_enum(models.TextChoices):
...
priority = "PRI",_("优先级"),
common_status = "STATUS",_("通用状态"),
project_type ="PROJ_TYP",_("项目-类型")
...
比如Project的model设计,type,status和priority3个field都是SimpleData的外键。
class Project(modelCommon):
...
type = models.ForeignKey(
SimpleData, on_delete=models.SET_NULL, blank=False, null=True,
verbose_name='类型', related_name='project_type')
status = models.ForeignKey(
SimpleData, on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='状态', related_name='project_status')
priority = models.ForeignKey(
SimpleData, on_delete=models.SET_NULL, blank=False, null=True,
verbose_name='优先级', related_name='project_priority')
...
在设置Project的type的值时,就要通过dataType来过滤出Project type相关的SimpleData的对象。
比如在Project的ModelForm中,type和priority的queryset就要过滤一下。
class ProjectModelForm(ModelForm):
required_css_class = 'required'
def __init__(self, *args, **kwargs):
creater = kwargs.pop("creater")
program = kwargs.pop("program")
super(ProjectModelForm, self).__init__(*args, **kwargs)
self.fields['type'].queryset = SimpleData.objects.filter(dataType = DatayType_enum["project_type"].value)
self.fields['priority'].queryset = SimpleData.objects.filter(dataType = DatayType_enum["priority"].value)
name和code
name为显示的名字,比如优先级中的高,中,低,紧急,状态中的已完成,进行中等。code为代号,为数字字母和下划线。code一般不改变,name可以根据需要来修改。项目中要指定哪个SimpleData对象,通过code来指定,不要用name来指定。因为name可以修改,这样当修改了SimpleData对象的显示名称后,不用再去修改代码。
systemCreated
这个用于指定一个SimpleData对象是由系统创建还是用户创建,系统创建的不能被删除和修改。
bgcolor 和color
背景色和前景色。
项目做到后面的时候,有需要将不同的SimpleData对象显示为不同的颜色。如优先级高显示为红,低显示为绿色。最开始的设计是直接在前端里判断SimpleData对象的code,再赋不同的颜色。这样写的弊端有两个,1是前端代码太复杂,比如优先级有4个,就要写4个判断。有些类型的SimpleData可能有5-6个值,比如状态,就要写5-6个判断。2是用户自定义的SimpleData无法显示自定义颜色。
所以就在SimpleData的model里直接定义了bgcolor 和color两个field。
在前面显示时,按下面代码显示background-color
<td>
<a role="button"
class="btn-sm btn-info"
style="background-color:{{item.priority.bgcolor}}"
{{ item.priority }}
</a>
</td>
bgcolor的值可以设置为html支持的颜色名字或颜色代码(加#号),或rgb表示法。
此项目中还和产品数据和附件类型,这两个model的设计思路和SimpleData类似,不再详述。