【问题标题】:How to sort by a propery of ManyToMany Object in Django?如何在 Django 中按多对多对象的属性进行排序?
【发布时间】:2020-04-27 19:58:05
【问题描述】:

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

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

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

例子

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()

【问题讨论】:

  • 有什么原因不能使用exclude()
  • 我认为我的问题是我试图按特定的“单位”顺序对其进行排序。在我的例子中 - 不是“unit1”,而是每个“问题”中的另一个

标签: django django-queryset


【解决方案1】:

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

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 过滤器的 Units,所以你应该得到你想要的结果。在我的示例中,它仅使用 ID 在 [1,2,3,4] 中的单位

【讨论】:

  • 有意思,我试试看:)
猜你喜欢
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2020-09-04
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
相关资源
最近更新 更多