这两个模型的作用是我也不知道后面会不会有用,因为出现就是固定的设置,不想每个模型都写。
所以我就直接包装了一下,没有什么用。
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": ""
}
]