通用数据(简单数据)模型设计

 通用数据(简单数据)

在大部分的业务类型的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类似,不再详述。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值