Как отсортировать по свойствам ManyToMany Object в Django? - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь отфильтровать объект по свойству order объекта ManyToMany. хитрая часть в том, что я пытаюсь исключить указанную c единицу из запроса, но, похоже, не могу найти, как это сделать.

Итак, что в основном должен делать запрос:

  1. получить все объекты Вопроса, назначенные определенному c блоку (одному из блоков в поле 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()

1 Ответ

0 голосов
/ 10 января 2020

Вам нужно использовать 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, поэтому вы должны получить результат, который вы хотите. В моем примере он использует только единицы с идентификатором в [1,2,3,4]

...