【问题标题】:django recurrent model lookupdjango 循环模型查找
【发布时间】:2019-01-30 02:33:11
【问题描述】:

我有一个经常性的类别模型(每个类别都可以有一个父类别),我也有带有 ForeignKey 到“核心类别”的产品模型,如下所示。是否有可能查询顶级类别(非核心)中的所有产品?

例如,我的类别树是:

---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

感谢您的帮助!

编辑:我认为这种特殊情况的最佳等价物是文件夹中的文件。单个文件(产品)仅知道其父目录(核心类别),但该父目录可能是其父目录的子文件夹。我想查询子目录中所有文件(产品)的顶级文件夹(类别)。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • @SachinKukreja 到目前为止,我尝试了一个循环,在该循环中我检查了哪些类别具有特定的父级,并深入了解上级父级,最后将所有“核心”存储在一个数组中并检查它们的产品。但我很好奇是否有一个没有循环的查询解决方案。

标签: python django model querying


【解决方案1】:

首先,通过在 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
)

【讨论】:

  • 感谢您的回答,但在这种情况下,查询将为空,因为所有产品都连接到核心类别。问题是找到与核心categpry 作为父级相关的顶级类别中的所有产品
  • 我认为最适合这种特殊情况的是文件夹中的文件。单个文件只知道其父目录,但该父目录可能是其父目录的子文件夹。我想查询子目录中所有文件的顶级文件夹。
  • 文件的核心是 False 还是 True?
  • Files = Products,它们有一个 core = True 的类别
  • 在更改之后我有 22 个参数的错误,但我将 .append(*_sub_core_categories) 更改为 .extend(_sub_core_categories) 并且它似乎有效!
猜你喜欢
  • 2014-03-10
  • 2018-08-08
  • 2020-08-28
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多