2016-03-08 8 views
7

मेरे पास auth.User मॉडल का QuerySet है।डीजेगो ओआरएम एनोटेशन: उपयोगकर्ता क्वेरीसेट का सबसे आम समूह

मैं जानना चाहता हूं: कौन से समूह इन उपयोगकर्ताओं में से अधिकतर हैं।

उदाहरण:

  • G1: u1 u2 U3 U4
  • G2: u1 u2
  • G3: u1 U4 यू 5 U6
  • g4: यू 5 U6 मैं तीन समूहों, इन उपयोगकर्ताओं के साथ है यू 7

उपयोगकर्ता-क्वेरीसमूह: u1 u2 U3

परिणाम (गिनती सदस्य हैं जिसमें दिए गए उपयोगकर्ता के क्वेरीसमूह में हैं):

  • G1: गिनती 3
  • G2: गिनती 2
  • G3: गिनती 1
  • g4: गिनती 0

कैसे क्या मैं Django 1.8 के साथ मॉडल समूह के एनोटेटेड क्वेरीरीसेट प्राप्त कर सकता हूं?

प्रयोग करें प्रकरण

दिखाएँ कैसे साथ "x" उपयोगकर्ता नाम प्रत्येक समूह है में कई सदस्यों को।

एसक्यूएल

SELECT auth_group.id, auth_group.name, 
(SELECT COUNT(auth_user_groups.id) FROM auth_user_groups WHERE 
    auth_user_groups.group_id = auth_group.id AND 
    auth_user_groups.user_id IN (SELECT auth_user.id FROM auth_user WHERE username LIKE '%x%')) AS user_cnt 
FROM auth_group ORDER BY user_cnt DESC; 

अद्यतन

समूह g4 कोई मिलता-जुलता सदस्य हैं, लेकिन यह एनोटेट क्वेरीसमूह में होना चाहिए।

उत्तर

7
from django.db.expressions import Case, When 
from django.db.models import Count, IntegerField 

Group.objects.annotate(
    user_cnt=Count(Case(When(user__in=user_list, then=1), 
         output_field=IntegerField())), 
) 
+0

अच्छा, आपका उत्तर काम करता है। परिणामी एसक्यूएल: 'SELECT "auth_group"। "Id", "auth_group"। "Name", COUNT (केस जब "auth_user_groups"। "User_id" IN (चुनें U0। "Id" से "auth_user" U0 कहां U0। " उपयोगकर्ता नाम ":: टेक्स्ट LIKE testfoobar%) फिर 1 ELSE नल अंत)" auth_group "से" user_cnt "के रूप में बाएं बाहरी जॉइन" auth_user_groups "चालू (" auth_group "।" id "=" auth_user_groups "।" group_id ") ग्रुप बाय" auth_group "।"id", "auth_group"। "name" ऑर्डर द्वारा "user_cnt" DESC' – guettli

0

Django में हम values पर आधारित कुछ ऑब्जेक्ट को समूहित कर सकते हैं और हम समूह परिणाम पर annotation लागू कर सकते हैं। इसे पढ़ें link यह समझाएगा कि मूल्यों और एनोटेशन का उपयोग कैसे करें।

group = Group.objects.filter(id=XX).values("user").annotate(Count("user__pk")) 

आप की जरूरत है केवल समूह के तहत उन का मतलब करने के लिए:

group = Group.objects.annotate(Count("user__pk")) 
+0

परिणाम के व्याख्या किए गए क्वेरीसमूह होना चाहिए समूह के उदाहरण इनपुट उपयोगकर्ता के उदाहरणों की एक क्वेरीसेट है। मैं इसे आपके उदाहरण में नहीं देख सकता। – guettli

1
list_group = [] 
for grp in Group.objects.filter(id__in = [g1, g2, g3, g4]): 
    print grp, '---', User.objects.filter(id__in = [u1, u2, u3], groups = grp).count() 
    list_group([grp, User.objects.filter(id__in = [u1, u2, u3], groups = grp).count()]) 

आशा .. क्या यह उत्तर स्वीकार्य है

+0

हां, यह काम करता है, लेकिन मैं पाइथन में लूप के लिए एसक्यूएल में लूप पसंद करता हूं। "मैं Django 1.8 के साथ मॉडल समूह के एनोटेटेड क्वेरीरीसेट को कैसे प्राप्त कर सकता हूं?" – guettli

संबंधित मुद्दे