Mam 3 stoły

Table1       Table2                   Category
======       =================        ==============
id, name     id, Table1_id, name      category_id, Table2_id, name

Teraz biorąc pod uwagę kategoria_id, muszę znaleźć te nazwy w tabeli1 należą do tej kategorii_id

Jedyne rozwiązanie, które mogę wymyślić praworę, jest wykonanie 2 pytań

similar_ids = Table2.objects.filter(category__category_id=_cat_id).values_list('id')

similar_names = Table1.objects.filter(table2__id__in=similar_ids).values_list('name').distinct()

Czy jest to sposób, aby zrobić to w jednym zapytaniu.

Dano również rozmiar 3 tabel (Table1 == 30,000 rows, Table2 and Category == 125000 rows) Co będzie właściwą rzecz do zrobienia: -

  1. Zrób pojedyncze zapytanie, dołączając do wszystkich tabel jednocześnie
  2. łamanie go na 2 części (jak powyżej)
0
Anurag Sharma 13 sierpień 2014, 13:25

2 odpowiedzi

Najlepsza odpowiedź

Sposób, w jaki reprezentowałeś swoje modele, jest dość niejasne z punktu widzenia Django. Oznacza to, że trudno jest użyć poprawnego related_name s w tym przypadku. Ale spróbujmy. Chciałbyś:

Table1.objects.filter(table2_set__category_set__id=myid).values_list('name')
1
Steve K 13 sierpień 2014, 09:48

Django nie wygeneruje dwóch zapytań do oryginalnego zapytania. Jeśli wykonasz tabelę2__id__in = podobne_ids, Django automatycznie użyje podzewności.

0
akaariai 13 sierpień 2014, 10:32