У меня есть эта структура объектов модели:
Класс 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 и не использую циклы.
Дозметие должно возвращать экземпляр класса с методом 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'))