当我有一个连接到M2M表的自我ForeignKey表时创建面包屑

时间:2018-05-18 11:18:04

标签: sql django postgresql

我想解决的问题是在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

父类别可以有多个子类别,没有深度限制;

此外,我还有一个与Category有ManytoMany关系的模型/表产品。 产品可以是多个类别,而类别可以有多个产品

中介表

|      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 - > Cat id 3 - > Cat id 7

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

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

1 个答案:

答案 0 :(得分:0)

您可能希望使用嵌套集(AKA mptt)或闭包表。您可以阅读此https://www.slideshare.net/billkarwin/models-for-hierarchical-data以获取有关在SQL中建模分层数据结构的各种方法的更多信息。

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

相关问题