如何在Django中使用parent_id?

时间:2017-10-26 04:04:23

标签: python django

在我的模特中:

class HomePageFirstModule(models.Model):
    name = models.CharField(max_length=8, unique=True)
    is_active = models.BooleanField(default=True)  # 是否启用


class HomePageSecondModule(models.Model):
    name = models.CharField(max_length=16, unique=True)
    is_active = models.BooleanField(default=True)  # 是否启用
    home_page_first_module = models.ForeignKey(to=HomePageFirstModule) # 所属的第一级模块


class HomePageThridModule(models.Model):
    name = models.CharField(max_length=16, unique=True)
    url = models.CharField(max_length=128)
    is_active = models.BooleanField(default=True)  # 是否启用
    home_page_second_module = models.ForeignKey(to=HomePageSecondModule)  # 所属的第二级模块

然后我使用filter方法查询数据:

def get_homepage_module_list():
    """
    获取到可以使用的模块信息
    :return:
    """

    data_query_list = models.HomePageThridModule.objects.filter(
        home_page_second_module__home_page_first_module="1"
    ).values('id', 'name', 'is_active', 'home_page_second_module__name',
             'home_page_second_module__home_page_first_module__name',
             'home_page_second_module__home_page_first_module__is_active',
             'home_page_second_module__is_active'
             )

    data_list_del = []
    data_list = list(data_query_list)
    for item in data_list:
        if (item['is_active'] == False) or (
                    item['home_page_second_module__is_active'] == False
        ) or (
                item['home_page_second_module__home_page_first_module__is_active'] == False
        ):
            data_list_del.append(item)

    for item_del in data_list_del:
        data_list.remove(item_del)

    return data_list

========================

如何转换此列表数据:

[
    {
        "home_page_second_module__name": "云主机",
        "home_page_second_module__home_page_first_module__name": "产品",
        "id": 1,
        "name": "云主机子1"
    },
    {
        "home_page_second_module__name": "云主机",
        "home_page_second_module__home_page_first_module__name": "产品",
        "id": 4,
        "name": "云主机子4"
    },
    {
        "home_page_second_module__name": "云硬盘",
        "home_page_second_module__home_page_first_module__name": "产品",
        "id": 2,
        "name": "云硬盘子2"
    },
    {

        "home_page_second_module__name": "云硬盘",
        "home_page_second_module__home_page_first_module__name": "产品",
        "id": 3,
        "name": "云硬盘子3"
    }
]

到此:

[
    {"name":"产品",
     "data":[
        {"name":"云主机",
         "data":[{"name":"云主机子1",
                  "data":{"id":1}},
                 {"name":"云主机子2",
                  "data":{"id":2}}]},
        {"name":"云硬盘",
         "data":[{"name":"云硬盘子1",
                  "data":{"id":3}},
                 {"name":"云硬盘子2",
                  "data":{"id":4}}]}
     ]
    }
]

应该有一个算术方法来做到这一点,但我尝试过,不要那样做。

我只想到以下小事:

home_page_second_module__name_list = []
home_page_second_module__home_page_first_module__name_list = []
id_list = []
name_list = []

for home_page_second_module__name,home_page_second_module__home_page_first_module__name,id,name  in ori_list:
    if not (home_page_second_module__name_list.__contains__(home_page_second_module__name)):
        home_page_second_module__name_list.append(home_page_second_module__name)
    if not (home_page_second_module__home_page_first_module__name_list.__contains__(home_page_second_module__home_page_first_module__name_list)):
        home_page_second_module__home_page_first_module__name_list.append(home_page_second_module__home_page_first_module__name)

但是现在我认为这很难做到,我认为我的做法是错误的。

有没有方便的方法来实现它?

修改

产品云主机云硬盘可以作为父ID。

2 个答案:

答案 0 :(得分:0)

过时的代码,因为原来的问题只是问如何将一个dicts列表转换为另一个具有不同结果的dicts列表

我敢打赌,这可以优化很多但是......假设你的dict被命名为old,我想这可能会这样做:

new = {'name': i['home_page_second_module__home_page_first_module__name'] for i in old if not i['home_page_second_module__home_page_first_module__name'] in old}
new['data'] = [['name': i['home_page_second_module__name'], 'data':[{'name': i['home_page_second_module__name'], 'data': {'id': i['id']}}]] for i in old]

答案 1 :(得分:0)

您可以使用django-rest-framework,并使用相关的序列化程序。 relations serializers