首页 > 解决方案 > 当我有一个连接到 M2M 表的自外键表时创建面包屑

问题描述

我要解决的问题是在 Django 中,但与我在数据库中的查询方式密切相关。

我有一个模型/表类别,它本身有一个 ForeignKey:

|      id     |     name    |  parent_id
|       1     |     name1   |    Null
|       2     |     name2   |    Null
|       3     |     name3   |    1
|       4     |     name4   |    1
|       5     |     name5   |    3
|       6     |     name6   |    3
|       7     |     name7   |    5

一个父类可以有多个子类,并且没有深度限制;

我还有一个模型/表产品,它与类别具有多对多关系。一个产品可以在多个类别中,一个类别可以有多个产品

中介表

|      id     |     product_id    |  category_id  
|       1     |       1           |    1     
|       2     |       1           |    2     
|       3     |       2           |    1        
|       4     |       2           |    3    
|       5     |       3           |    5     
|       6     |       3           |    4    
|       7     |       3           |    7   

产品表

|      id     |     name    
|       1     |     name1   
|       2     |     name2   
|       3     |     name3   

我需要的:

1) 为面包屑获取与产品对应的第一组类别

产品名称 3:类别 ID 1 -> 类别 ID 3 -> 类别 ID 7

2)从一个类别开始获取该类别及其子类别中的所有产品

我想在几个查询中得到它们,避免从子类到父类递归调用数据库

标签: sqldjangopostgresql

解决方案


您可能想要使用嵌套集 (AKA mptt) 或闭包表。您可以阅读此https://www.slideshare.net/billkarwin/models-for-hierarchical-data,了解更多关于在 SQL 中对分层数据结构建模的各种方法。

嵌套集(mptt)可能是最复杂的模式,但有一个实现它的 django 应用程序的第 3 部分:https ://github.com/django-mptt/django-mptt 。


推荐阅读