python - 如何优化 django 中自引用模型中相关记录的检索?

标签 python django django-forms django-queryset

我正在从模型创建表单。该表单包含一个类别。类别模型是一个自引用模型。我想在表单的下拉列表中显示类别,以便它们也显示其父类别。即,

parentcat3 > Parentcat2 > Parentcat1 > leafcategory

最后一个类别由leafCategory=True表示。

我已经覆盖了我的 ModelForm,仅选择叶(结束)类别的记录,使用:

self.fields['primaryCategory'].queryset = Category.objects.exclude(leafCategory=False)

然后,ModelForm 下拉列表使用模型中 __unicode__ 的返回值:

getFullPathString()

这将返回“树”以查找父类别。这是速度慢的部分(有 10,000 个类别)

如何优化父记录的检索?

这是我正在使用的代码:

型号

class Category(models.Model):
    name = models.CharField(max_length=200)
    parent = models.ForeignKey("self",related_name='related_category',null=True)
    leafCategory=models.BooleanField(default=False)

    def __unicode__(self):
        return u"%s" % self.getFullPathString()

    def getParentArray(self):
        """Create an array of parent objects from the current category """
        itemArray=[]

        itemArray.insert(0,self)
        parentCat=self.parent

        while parentCat:
            itemArray.insert(0,parentCat)
            parentCat=parentCat.parent
        return itemArray

    def getFullPathString(self):
        """Get the parent category names, cat 1 > cat 2 etc"""
        returnText=""
        for item in self.getParentArray():
            returnText += item.name
            if not item.isLeaf():
                returnText += " > "
        return returnText

表格

class InventoryForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(InventoryForm, self).__init__(*args, **kwargs)
        self.fields['primaryCategory'].queryset = Category.objects.exclude(leafCategory=False)

最佳答案

这段代码效率极其低下。它将针对每个类别以及每个类别的祖先执行一系列新的数据库查询。

您需要研究针对在数据库中存储和检索此类分层数据而优化的算法。 django-mptt其中我最喜欢的是。

顺便说一句,在列表开头重复插入元素也是低效的。列表针对附加进行了优化,但并未针对插入进行优化。为在两端添加而优化的数据结构是 Python 的 collections 模块中的 deque - 但更好的解决方案可能是简单地追加元素,然后调用 reverse () 在返回列表之前。

关于python - 如何优化 django 中自引用模型中相关记录的检索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5362174/

相关文章:

python - Django - 为每个模型对象生成随机、唯一的 slug 字段

python - Django 管理多对多反转?

Django:ModelMultipleChoiceField 不会保存数据

python - 为什么我的表格总是未绑定(bind)?

python - 如何在处理 ctrl-C 事件时访问局部变量?

python - 如何计算 Pandas DataFrame 中行之间的百分比增长?

python - Django渲染无法找到实际存在的模板

django - 如何从表单构造函数动态更新Django Form Meta类字段?

python - 如何将 Iperf 结果保存在输出文件中

python - Python连接MYSQL,获取SP500符号