我不确定标题是否正确,因为我不太了解发生了什么(但我相信情况似乎如此?)。
我有一个类别模型,它自己有一个ForeignKey(类别)。 我想要做的是获得所有子类别的列表。
示例:食物 - > Fruit,Food.get_subcategories()会给我[Fruit]。
我有一个这样的模型:
class Category(models.Model):
title = models.CharField(max_length = 100)
subcategory = models.ForeignKey("self", blank=True, null=True)
user = models.ForeignKey(User)
objects = CategoryManager()
def get_lowest_category(self):
if self.subcategory:
return self.subcategory.get_lowest_category()
return self
def get_subcategories(self, out_list=list()):
if self.subcategory:
if self.subcategory == self:
return out_list
out_list.append(self.subcategory)
return self.subcategory.get_subcategories(out_list=out_list)
print(out_list)
return out_list
相关的观点部分如下:
if "search" in request.POST:
categories_left = Category.objects.for_title(request.POST["left-search"], user=request.user)
categories_right = Category.objects.for_title(request.POST["right-search"], user=request.user)
elif "create" in request.POST:
Category.objects.create(user=request.user, title=request.POST["title"])
elif "add-subcategory" in request.POST:
left = Category.objects.for_id(request.POST["left-category"], user=request.user)
right = Category.objects.for_id(request.POST["right-category"], user=request.user)
try:
new_category = deepcopy(left)
new_category.pk = None
new_category.save()
Category.objects.filter(id=new_category.id).update(subcategory=right)
except IntegrityError:
print("This combination already exists.") # TODO
模板:
<p>Search categories form</p>
<div id="searchboxes">
<form action="/category/" method="post">
{% csrf_token %}
<input type="text" name="left-search">
<select multiple="multiple" id="left-category" name="left-category">
{% for category in categories_left %}
<option value="{{ category.id }}">{{ category }}, {{ category.get_subcategories }}</option>
{% endfor %}
</select>
<input type="text" name="right-search">
<select multiple="multiple" id="right-category" name="right-category">
{% for category in categories_right %}
<option value="{{ category.id }}">{{ category }}, {{ category.get_subcategories }}</option>
{% endfor %}
</select>
<input type="submit" name="search" value="Search categories">
<input type="submit" name="add-subcategory" value="Add subcategory">
</form>
</div>
我创建了三个类别,然后选择&#34; Food&#34;在左边和&#34; Fruit&#34;在右侧单击&#34;添加子类别&#34;,然后使用空字段搜索以列出两个框中的所有类别, 它看起来像
我用调试器和get_subcategories(self,out_list)函数调用中的out_list检查了前一个调用的列表 - 为什么?
它有一个默认值(list()所以当调用该函数时它应该总是一个空列表,但不知何故上一个调用的列表进入并且我不明白在哪里。
我在管理面板上注册了类别模型并检查了那里的类别,它们是正确的(食物有子类别水果,还有另一个没有子类别的食物类别)。