python – Django中的ForeignKey表单限制

我正在使用Django编写一个博客应用程序,我正在尝试实现一个分层类别结构.每个类别都有一个“父”ForeignKey,指向同一个Category模型.我想允许管理员添加类别,我希望界面允许他们选择类别的父类别.但是,我想避免我自己的爷爷情况,所以我想将类别的可用选择限制为那些没有作为祖先的类别的类别.

现在,我从视图中控制了这个:

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_pa​​rent_list来获取选项,当我真的只是指定一个小部件时,将选择机制写入我的模板.

有没有更好的方法来做到这一点?我知道我可以在后端添加自定义验证来防止这种情况,但为什么要给用户提供选项呢?

最佳答案 如果我正确理解你的困境,那么问题本身就在于你处理哪些类别可以是父母而哪些类别不能成为父母的方式.避免这些问题的一个选择是实际上限制可以成为父母的类别的级别.例如,假设您有以下类别:

>互联网

>谷歌
>雅虎

>离线

> MS Office
> OpenOffice

我通常处理这个的方式是我在类别表上显然有一个parent_id FK.对于根元素(Internet,离线),parent_id将为0.因此,当您在视图中尝试检索下拉列表的“父类别”时,您需要确定它们可以在多长时间内保持嵌套.我主要将此限制在第一级,因此要选择在您的下拉列表中显示哪些类别,您需要执行以下操作:

parents = Category.objects.filter(parent_id=0)

现在很明显,这有点限制了这种方法,但你可以增加你想要包含的级别,并在模板中为下拉列表设计某种视觉识别系统(包括层次结构中每个级别的额外空格或破折号) ).

无论如何,对于长时间的回复感到抱歉,希望这有点解决了你的问题.

点赞