Отфильтруйте Многих Многим отношение в Django

У меня есть эта структура объектов модели:

Класс A:
b = models.ManyToManyField("B")
Класс B:
c = models.ForeignKey("C")
d = models.ForeignKey("D")
Класс C:
d = models.ForeignKey("D")

Это - запрос, который я пытаюсь получить:
Я хочу получить все объекты B объекта A, затем в каждом объекте B выполнить сравнение между объектом D и объектом c.d.

Я знаю, что просто перемещаются в набор B с для цикла и делают это сравнение. Но я погрузился на отношении ManyToMany, затем я заметил, что могу сделать следующее:

bObjects = A.objects.all().b

q = bObjects.filter(c__d=None)

Это работает, это дает мне все объекты c с None d поле. Но когда я пробую следующее:

q = bObjects.filter(c__d=d)

Это дает мне, d, не определенный, но d, является объектом как c в объекте B.

Какова может быть проблема? Я буду счастлив, если Вы предложите дальнейший способ сделать эту задачу. Я обычно я пытаюсь записать свой запрос в единственной операции со многими ко многим объектам sub и не использую циклы.

7
задан Jeremy Banks 30 August 2012 в 19:42
поделиться

1 ответ

Дозметие должно возвращать экземпляр класса с методом DOSOMBETHELTELSE.

-121--4180405-

q = bobjects.filter (c_d = d) // Дайте мне d не определены. Но D - объект, такой как C в объекте B.

Попробуйте это:

from django.db.models import F
q = bObjects.filter(c__d=F('d'))

Как к вопросу из вашего комментариев ниже вы можете иметь 1 квл запрос вместо 100 тем способами:

1), если вы можете Выразите свой выбор объектов в терминах запроса (например, A.Price <10 и A. Weight> 20) Используйте это:

B.objects.filter(a__price__lt=10, a__weight__gt=20, c__d=F('d'))

или это:

B.objects.filter(a__in=A.objects.filter(price__lt=10, weight__gt=20), c_d=F('d'))

2) Если у вас просто есть список объектов Python Используйте это:

B.objects.filter(a__pk__in=[a.pk for a in your_a_list], c__d=F('d'))
6
ответ дан 7 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: