我正在使用 Django 编写博客应用程序,并且正在尝试实现分层类别结构。每个类别都有一个“父”外键,指向同一个类别模型。我想允许管理员添加类别,并且我希望界面允许他们选择类别的父类别。但是,我想避免我是我自己的祖父的情况,所以我想将可用的类别选择限制为那些没有作为祖先的类别。
现在,我正在从视图中控制它:
parent_candidates = list(Category.objects.all())
pruned_parent_list = [cat for cat in parent_candidates if instance.id not in cat.getHierarchy()]
其中 instance 是正在编辑的类别,而 getHierarchy() 是获取祖先 ID 列表的方法。
这种方法存在许多问题。特别是,它使用额外的数据库命中来获取所有类别的列表,并且当我真的只想指定一个小部件时,它使我通过循环 pruned_parent_list 来将选择机制写入我的模板以获取选项。
有没有更好的方法来做到这一点?我知道我可以在后端添加自定义验证来防止这种情况,但为什么要让用户选择呢?