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