【Django笔记】封装转常见格式Json、封装主从表结构模型

这两个模型的作用是我也不知道后面会不会有用,因为出现就是固定的设置,不想每个模型都写。

所以我就直接包装了一下,没有什么用。

class BaseModelDataMark(models.Model):
    """抽象模型:包含生效、假删除标记"""
    enabled = models.BooleanField(default=False)
    deleted = models.BooleanField(default=False)

    class Meta:
        abstract = True
class BaseModel(models.Model):
    """基模型"""
    code = models.CharField(max_length=32)
    name = models.CharField(max_length=32)
    desc = models.CharField(max_length=32)

    def get_simple(self):
        """把自己模型内配置的属性转成字典,方便后面转json"""
        res = {}
        res.update(self.__dict__)
        res.pop('_state')
        return res

    class Meta:
        abstract = True

一开始网上找,始终找不到如何在分组里用ManyToOneRef实例化出来明细实体。 找不到怎么办?print打印实体看,拷出来搜索从表模型名字。经过一些尝试后,终于是可以弄出来了。

后来无意中试出来self._meta.related_objects和self._meta.get_fields(True)这两个方法能获取到关联表的结构。 以后的主从表结构的主表模型继承自这个模型的话,后面的get很轻松,当然仅限于少量数据的表

不足处是从表模型的外键必须是“parent”,因为我在主表模型中写死了关联字段为parent_id。这是个缺陷吧,我不知道怎么去掉这个限制。如果刚好有读者研究过,希望可以分享一下呀。

总之,这个主表的模型我自己一个刚学不久的人是感觉好有成就感。

class BaseModelParent(BaseModel):
    """主从表主表模型"""

    @classmethod
    def get_all_with_members(cls):
        """获取所有数据(包括从表明细)"""
        res_list = []
        enabled_objs = cls.objects.filter(enabled=True)
        for group in enabled_objs:
            res_list.append(group.get_members())
        return res_list

    @classmethod
    def get_all(cls):
        """获取所有数据"""
        return cls.objects.filter(enabled=True)

    def get_members(self):
        """获取当前实体下的所有从表明细"""
        # 把self转成字典
        group_simple_obj = self.get_simple()
        # 遍历关联的从表映射集
        for many_to_one_rel in self._meta.related_objects:
            # 用于临时保存从表数据集合
            group_members = []
            # 获取到从表中父级id等于当前对象的集合(缺陷:从表模型只能以parent关联主表模型)
            related_data_list = many_to_one_rel.related_model.objects.filter(enabled=True, parent_id=self.id)
            # 遍历从表数据集合
            for related_data in related_data_list:
                # 处理成字典
                group_members.append(related_data.get_simple())
                # 按django的从表模型名称+“_set”命名
                member_name = many_to_one_rel.related_model._meta.model_name + "_set"
                # 压入返回结果集
                group_simple_obj.update({member_name: group_members})

        return group_simple_obj

    class Meta:
        abstract = True

下面是真正建模型的代码,只需要注意外键是parent就可以了。

如果想改成自己喜欢的命名,需要修改主表模型的related_data_list 那一行的filter就可以了。


class Dictionary(BaseModel, BaseModelDataMark):
    """字典"""
    parent = models.ForeignKey('DictionaryGroup', on_delete=models.DO_NOTHING)

    class Meta:
        db_table = 'sys_dictionary'


class DictionaryGroup(BaseModelParent, BaseModelDataMark):
    """字典分组"""
    class Meta:
        db_table = 'sys_dictionary_group'

下面是接口的内容

def dic_get(request):
    """获取所有字典"""
    data = DictionaryGroup.get_all_with_members()
    return HttpResponse(json.dumps(data))

最后要说一下,如果需要搬代码或者转载的,希望有幸能够被留一下出处哦。

最后附带调用结果Json:

[
    {
        "id": 1,
        "enabled": true,
        "deleted": false,
        "code": "test",
        "name": "测试",
        "desc": "",
        "dictionary_set": [
            {
                "id": 1,
                "enabled": true,
                "deleted": false,
                "code": "test",
                "name": "测试",
                "desc": "",
                "parent_id": 1
            },
            {
                "id": 2,
                "enabled": true,
                "deleted": false,
                "code": "test1",
                "name": "测试1",
                "desc": "",
                "parent_id": 1
            }
        ]
    },
    {
        "id": 2,
        "enabled": true,
        "deleted": false,
        "code": "test",
        "name": "测试",
        "desc": "",
        "dictionary_set": [
            {
                "id": 3,
                "enabled": true,
                "deleted": false,
                "code": "test2",
                "name": "测试2",
                "desc": "",
                "parent_id": 2
            },
            {
                "id": 4,
                "enabled": true,
                "deleted": false,
                "code": "test3",
                "name": "测试3",
                "desc": "",
                "parent_id": 2
            }
        ]
    },
    {
        "id": 3,
        "enabled": true,
        "deleted": false,
        "code": "test",
        "name": "测试",
        "desc": ""
    }
]

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值