当前位置: 首页 > 面试题库 >

Django:通过多对多字段订购模型

万嘉石
2023-03-14
问题内容

我正在编写一个具有People模型的Django应用程序,但遇到了麻烦。我正在使用“多对多”关系将角色对象分配给人们-
角色具有名称和权重。我希望按角色最重的顺序来排列我的人员清单。如果我执行People.objects.order_by(’-roles__weight’),那么当人们被分配了多个角色时,我会得到重复。

我最初的想法是添加一个称为 最重角色权重 的非规范化字段-
并以此进行排序。每次添加新角色或从用户删除新角色时,都可以更新此信息。然而,事实证明,有没有办法来执行自定义操作每次ManyToManyField是在Django(更新时间还没有,反正)。

因此,我认为我可以完全放弃,编写一个自定义字段,描述符和管理器来处理此问题,但是当为ManyToManyField动态创建ManyRelatedManager时,这似乎非常困难。

我一直在尝试提出一些聪明的SQL可以为我做到这一点-我敢保证子查询(或几个子查询)是可能的,但是我担心它与所有数据库后端Django都不兼容支持。

有人曾经做过此事吗?或者对如何实现它有任何想法吗?


问题答案:

Django
1.1(当前为beta)增加了对聚合的支持。您的查询可以通过以下方式完成:

from django.db.models import Max
People.objects.annotate(max_weight=Max('roles__weight')).order_by('-max_weight')

这样可以按最重的角色对人员进行排序,而不会返回重复项。

生成的查询是:

SELECT people.id, people.name, MAX(role.weight) AS max_weight
FROM people LEFT OUTER JOIN people_roles ON (people.id = people_roles.people_id)
            LEFT OUTER JOIN role ON (people_roles.role_id = role.id)
GROUP BY people.id, people.name
ORDER BY max_weight DESC


 类似资料:
  • 问题内容: 这可能无关紧要,只是想问一下, 如果一个对象从视图传递到模板,并且在模板中我将能够查询许多字段 型号代码: 观看次数: 在模板中可以解码多对多字段,因为我们正在传递对象 谢谢.. 问题答案: 通常,您可以通过django模板系统中的路径来跟踪任何不带参数的属性或方法调用。 对于上面的视图代码,类似 应该做您期望的。 (我无法完全从代码示例中找出具体细节,但希望这会阐明您可以从模板中学到

  • 问题内容: 考虑以下模型和形式: 当你查看ToppingForm时,它使你可以选择浇头所用的披萨,而一切都太花哨了。 我的问题是:如何为披萨定义一个ModelForm,让我利用披萨和馅料之间的多对多关系,并让我选择披萨上的馅料? 问题答案: 我想你会在这里新添加到你,并手动链接,表单字段与模型领域,如Django会不会为你做自动。 以下代码段可能会有所帮助: 这然后可以使用无处不在,甚至在admi

  • 问题内容: 当ORDER BY基于CASE语句时,选择多个ORDER BY列的正确MS SQL语法是什么? 以下对于单列工作正常,但我需要按多列进行排序: 问题答案: 你可以试试这个

  • 问题内容: 我在从表单保存许多字段时遇到问题。这是我的模型: 在这里,我在中处理发布请求: 每当我通过表单保存时,只有Notes文本字段都会保存在PHIssue实例中,并且许多字段都是空白。有人可以帮我找出问题所在吗? 问题答案: 使用时,你必须致电 关系要求先保存父对象,而你并没有使用

  • 问题内容: 我的模特: 我想同时保存并保存在该模型中: 我知道这是错误的,但是我敢肯定,你会明白我的意思。你会怎么做? 问题答案: 你不能从未保存的对象创建m2m关系。如果有pk,请尝试以下操作: 更新:阅读了saverio的答案后,我决定对这个问题进行更深入的研究。这是我的发现。 这是我最初的建议。它可以工作,但不是最佳选择。(注意:我使用的是和而不是s和,但你明白了。) 它总共产生7个查询:

  • 问题内容: 如何将多对多字段序列化为列表,然后通过rest框架返回它们?在下面的示例中,我尝试返回该帖子以及与其关联的标签列表。 models.py serializers.py views.py 问题答案: 你将需要一个,其有。之后被创建,修改与一个关系: