django 循环模型查找
django recurrent model lookup
我有一个经常性的类别模型(每个类别都可以有一个父类别),我还有一个带有 ForeignKey 到 "core category" 的产品模型,如下所示。是否有可能查询顶级类别(非核心)中的所有产品?
例如,我的类别树是:
---Sales (main) (parent = None)
---Crm (core) (parent = Sales)
---Marketing Automation (core) (parent = Sales)
---AI (parent = Sales)
---BOTS (core) (parent = AI)
---NLP (core) (parent = AI)
我想查询"Sales"或"AI"
中的所有产品
型号:
class Category(models.Model):
name = models.CharField(max_length=255)
link = models.URLField(max_length=255, null=True, blank=True)
core = models.BooleanField()
main = models.BooleanField()
parent = models.ForeignKey('self', on_delete=models.SET_NULL,
null=True, default=None)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=255)
link = models.URLField(max_length=255, null=True, blank=True)
category = models.ForeignKey(Category, on_delete=models.SET_NULL,
null=True, default=None)
def __str__(self):
return self.name
感谢您的帮助!
编辑: 我认为对于这种特殊情况最好的等价物是文件夹中的文件。单个文件(产品)只知道其父目录(核心类别),但此父目录可能是其父目录的子文件夹。我想查询子目录中所有文件(产品)的顶级文件夹(类别)。
首先,在 Category
实例上使用反向外键查找 category_set
获取所有子类别。
解决方法:
def recursive_sub_category(top_level_category_name, sub_core_categories=None):
if sub_core_categories is None:
sub_core_categories = list()
top_level_category = Category.objects.get(name=top_level_category_name)
_sub_core_categories = top_level_category.category_set.filter(core=True, main=False)
if _sub_core_categories.count() > 0:
sub_core_categories.append(*_sub_core_categories)
sub_main_categories = top_level_category.category_set.filter(main=True, core=False)
for category in sub_main_categories:
_sub_core_categories = recursive_sub_category(
category.name,
sub_core_categories=sub_core_categories
)
if len(_sub_core_categories) > 0:
sub_core_categories.append(*_sub_core_categories)
return sub_core_categories
sub_core_categories = recursive_sub_category("Sales")
core_products_under_sales = Product.objects.filter(
category__in=sub_core_categories
)
我有一个经常性的类别模型(每个类别都可以有一个父类别),我还有一个带有 ForeignKey 到 "core category" 的产品模型,如下所示。是否有可能查询顶级类别(非核心)中的所有产品?
例如,我的类别树是:
---Sales (main) (parent = None)
---Crm (core) (parent = Sales)
---Marketing Automation (core) (parent = Sales)
---AI (parent = Sales)
---BOTS (core) (parent = AI)
---NLP (core) (parent = AI)
我想查询"Sales"或"AI"
中的所有产品型号:
class Category(models.Model):
name = models.CharField(max_length=255)
link = models.URLField(max_length=255, null=True, blank=True)
core = models.BooleanField()
main = models.BooleanField()
parent = models.ForeignKey('self', on_delete=models.SET_NULL,
null=True, default=None)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=255)
link = models.URLField(max_length=255, null=True, blank=True)
category = models.ForeignKey(Category, on_delete=models.SET_NULL,
null=True, default=None)
def __str__(self):
return self.name
感谢您的帮助!
编辑: 我认为对于这种特殊情况最好的等价物是文件夹中的文件。单个文件(产品)只知道其父目录(核心类别),但此父目录可能是其父目录的子文件夹。我想查询子目录中所有文件(产品)的顶级文件夹(类别)。
首先,在 Category
实例上使用反向外键查找 category_set
获取所有子类别。
解决方法:
def recursive_sub_category(top_level_category_name, sub_core_categories=None):
if sub_core_categories is None:
sub_core_categories = list()
top_level_category = Category.objects.get(name=top_level_category_name)
_sub_core_categories = top_level_category.category_set.filter(core=True, main=False)
if _sub_core_categories.count() > 0:
sub_core_categories.append(*_sub_core_categories)
sub_main_categories = top_level_category.category_set.filter(main=True, core=False)
for category in sub_main_categories:
_sub_core_categories = recursive_sub_category(
category.name,
sub_core_categories=sub_core_categories
)
if len(_sub_core_categories) > 0:
sub_core_categories.append(*_sub_core_categories)
return sub_core_categories
sub_core_categories = recursive_sub_category("Sales")
core_products_under_sales = Product.objects.filter(
category__in=sub_core_categories
)