2015-01-22 2 views
0

Рассмотрим следующие определения:Двойной обратный поиск в джанго?

class A(models.Model): 
    ... 

class B(models.Model): 
    a_obs = models.ForeignKey(A, related_name='b') 

class C(models.Model): 
    b_obs = models.ForeignKey(B, related_name='c') 

скажем, у нас есть экземпляр ob1 типа A. Как я могу сделать двойной обратный поиск, чтобы получить все экземпляры C, связанные с ob1, без использования C.objects или менеджеров B.objects?

Обычно ob1.b.all() даст мне QuerySetB, но что тогда?

+0

Почему вы не можете использовать 'C.objects' или' B.bjects'? – mipadi

+0

@mipadi из-за кругового импорта. –

+0

Почему бы не исправить или не обработать круглый импорт? – mipadi

ответ

0

Выполнение «двойного обратного поиска» требует больших ресурсов. Вы уверены, что данные не могут быть структурированы каким-либо другим способом?

Чтобы ответить на ваш вопрос, я нашел решение here, которое может соответствовать вашим требованиям. Попробуйте сделать:

# You start with object A as objA 
objsB = objA.b.all() 
requested_c_objects = [C.objects.filter(b_obs=b) for b in objsB] 

Я не проверял его, поэтому он может содержать ошибки, но надеюсь, что вы получите эту идею.

P.S .: Без *.objects невозможно. Попробуйте добавить собственные методы Менеджера или непосредственно в синтаксисе SQL.

Смежные вопросы