سؤال

أعرف أن 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top