gpt4 book ai didi

python - Django 中的 ForeignKey 形式限制

转载 作者:太空宇宙 更新时间:2023-11-03 11:36:29 24 4
gpt4 key购买 nike

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

现在,我正在从 View 中控制它:

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 来获取选项,从而将选择机制写入我的模板,而我真的宁愿只指定一个小部件。

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

最佳答案

我不得不在 SQL 上处理任意深度的类别,它似乎不太适合以正常形式存储这种类型的数据,因为嵌套查询和/或多个 JOIN 往往变得丑陋非常 很快。

这几乎是我会采用一种不正确解决方案的唯一情况,即以字符串形式存储类别,子类别由定界符分隔。它使数据库查询和其他操作变得更加简单。

类别表看起来像这样:

id    name
1 Internet
2 Internet/Google
3 Internet/Yahoo
4 Offline
5 Offline/MS Office/MS Excel
6 Offline/Openoffice

另一种解决方案是,根据您的预期用途,您可以在类别列表中实现二叉树。这允许优雅地选择类别树和父/子关系。然而,它有一个局限性,即在插入新类别时可能必须重新计算整棵树,并且提前知道树的大致大小是有用的。

无论如何,SQL 中的分层数据本身并不是微不足道的,因此,无论您做什么,您都可能需要进行相当多的自定义编码。

关于python - Django 中的 ForeignKey 形式限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/401118/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com