如何在 Django 中按 属性 的 ManyToMany 对象排序?

How to sort by a propery of ManyToMany Object in Django?

我正在尝试通过 ManyToMany 对象的 "order" 属性 来过滤对象。这里棘手的部分是我试图从查询中排除一个特定的单位,但似乎找不到如何去做。

所以,查询基本上应该做的是:

  1. 获取分配给特定单元(M2M 字段中的单元之一)的所有问题对象
  2. 按分配给问题的所有其他单元的 "order" 属性 对它们进行排序

例子

ID  Question     Question.unit
1   question1    unit1, unit2
2   question2    unit1, unit3
3   question3    unit1, unit4
ID  Unit     Unit.order
1   unit1    1
2   unit2    2
3   unit3    3
4   unit4    4

代码:

#views - my code so far, seems to filter by all units
def get_questions_beside_unit():
    questions = Question.objects.filter(unit=quiz.unit).order_by('unit__order')

#models
class Question(models.Model):
    ...
    unit = models.ManyToManyField(Unit)

class Unit(models.Model):
    order = models.IntegerField()

您需要使用预取,这样您就可以控制从数据库中获取哪些相关对象。

from django.db.models import Prefetch

pf = Prefetch('unit', Unit.objects.filter(id__in=[1,2,3,4]))
questions = Question.objects.prefetch_related(pf).order_by('unit__order')

排序时,只有符合Prefetch过滤条件的Unit,所以应该会得到你想要的结果。在我的示例中,它仅使用 ID 为 [1,2,3,4]

的单位