2012-10-04 7 views
7

mam następujące modele:Grupa przez Key Zagranicznego i wykazują podobne przedmioty - Django

class Company(CachedModel): 
    name = models.CharField(max_length=255) 

class UserExtendedProfile(CachedModel): 

    company = models.ForeignKey(Company) 
    user = models.ForeignKey(User) 

I w zasadzie trzeba uzyskać listę użytkowników zamówionej przez spółkę tak:

Company A 
    User 1 
    User 2 

Company B 
    User 3 
    user 4 

próbowałem kilka rzeczy, a najbliżej mogę się dostać to:

users = UserExtendedProfile.objects.values('company', 'user').order_by('company') 

To jednak dałoby mi wyniki podobne do tego:

[{'company': 1L, 'user': 17L}, {'company': 1L, 'user': 6L}, {'company': 2L, 'user': 15L}] 

Dowolne dane wejściowe?

Dzięki

+0

Twoje dane wyjściowe nie sumują się ani nie liczą. –

+0

oops .. przepraszam .. muszę zaktualizować tekst. – karthikr

+0

dlaczego nie spróbujesz dołączyć i surowe zapytanie –

Odpowiedz

7

Można dodać wiele argumentów na metody order_by(). Dzięki temu możesz zamawiać w zamówieniach.

users = UserExtendedProfile.objects.values('company', 'user').order_by('company', 'user') 

Dla struktury takie jak:

[{ company: [user1, user2, ] }, ] 

Spróbuj użyć defaultdict

from collections import defaultdict 
users = defaultdict(list) 
for result in UserExtendedProfile.objects.values('company', 'user').order_by('company', 'user'): 
    users[result['company']].append(result['user']) 

Mając to powinieneś dostać na użytkowników struktury chcesz.

+0

ale jest to po prostu inny sposób reprezentowania zestawu wyników, szukam czegoś takiego: '{firma: [użytkownik1, użytkownik2,]}' – karthikr

+0

Edytowałem post z odpowiedzią. Nie sądzę, że django może to zrobić bezpośrednio z kwerendy. Jednak odpowiedź, którą wysłałem, powinna zawierać twoją odpowiedź. Pozdrawiam – andrefsp

+0

Świetne .. Po prostu muszę wymyślić sposób na zdobycie obiektów zamiast identyfikatorów, i wszystko gotowe ... Dziękuję :) – karthikr