معادلة Django من Count with Group بواسطة
-
20-08-2019 - |
سؤال
أعرف أن Django 1.1 لديه بعض طرق التجميع الجديدة. ومع ذلك لم أستطع معرفة ما يعادل الاستعلام التالي:
SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
هل من الممكن مع واجهة برمجة تطبيقات Django 1.1 للاستعلام أو هل يجب أن أستخدم SQL Plain؟
المحلول
إذا كنت تستخدم Django 1.1 Beta (Trunk):
Player.objects.values('player_type').order_by().annotate(Count('player_type'))
values('player_type')
- لإدراج فقطplayer_type
الحقل فيGROUP BY
بند.order_by()
- للإقصاء ، الطلب الافتراضي المحتمل الذي يمكن أن يتسبب في إدراج الحقول في الحقول فيSELECT
وGROUP BY
.
نصائح أخرى
Django 1.1 لا يدعم طرق التجميع مثل العد. يمكنك إيجاد الوثائق الكاملة هنا.
للإجابة على سؤالك ، يمكنك استخدام شيء على غرار:
from django.db.models import Count
q = Player.objects.annotate(Count('games'))
print q[0]
print q[0].games__count
سيحتاج هذا إلى تغيير بسيط اعتمادًا على نموذجك الفعلي.
تحرير: يولد المقتطف أعلاه مجموعات على أساس لكل كائن. إذا كنت تريد التجميع في حقل معين في النموذج ، يمكنك استخدام values
طريقة:
from django.db.models import Count
q = Player.objects.values('playertype').annotate(Count('games')).order_by()
print q[0]
print q[0].games__count
order_by()
هناك حاجة لأن الحقول الموجودة في الطلب الافتراضي يتم تحديدها تلقائيًا حتى لو لم يتم تمريرها بشكل صريح values()
. هذه الدعوة إلى order_by()
مسح أي طلب ويجعل الاستعلام يتصرف كما هو متوقع.
أيضًا ، إذا كنت ترغب في حساب الحقل المستخدم للتجميع (أي ما يعادل COUNT(*)
)، يمكنك استخدام:
from django.db.models import Count
q = Player.objects.values('playertype').annotate(Count('playertype')).order_by()
print q[0]
print q[0].playertype__count