James L.
James L.

Reputation: 1153

Get count for objects

I want to get specialization count for all the doctors and want to show it in the admin panel

Here are the models

class Doctor(models.Model):
    name = models.CharField(max_length=1300)
    specialization = models.ForeignKey(Specialization)
    clinic = models.ForeignKey(Clinic)

class Specialization(models.Model):
    name = models.CharField(max_length=30)

For instance, I want to show like:

Dermatologist: 10

Ophthalmologist: 15

I'm very new to Django and have no clue on how to go about it.

Upvotes: 0

Views: 105

Answers (3)

catavaran
catavaran

Reputation: 45555

Don't use obj.doctor_set.count() recipe. This method will be called for each Specialization record.

Use single SQL query with aggregation:

# admin.py
from django.contrib import admin
from django.db.models import Count
from app.models import Specialization

class SpecializationAdmin(admin.ModelAdmin):

    list_display = ['name', 'doctor_count_display']

    def get_queryset(self, request):
        qs = super(SpecializationAdmin, self).get_queryset(request)
        return qs.annotate(doctor_count=Count('doctor')).order_by('-doctor_count')

    def doctor_count_display(self, obj):
        return obj.doctor_count
    doctor_count_display.short_description = 'Number of doctors'
    doctor_count_display.admin_order_field = 'doctor_count'

admin.site.register(Specialization, SpecializationAdmin)

Upvotes: 1

doniyor
doniyor

Reputation: 37846

you can accomplish this in this way for example:

#admin.py
class SpecializationAdmin(admin.ModelAdmin):
    list_display = ('get_count',)
    def get_count(self, obj):
        return u"{}: {}".format(obj.name, obj.doctor_set.count())
    get_count.short_description = "Number of Doctors"

and register this like:

# also in admin.py
admin.site.register(Specialization, SpecializationAdmin)

dont forget to import Specialization model into admin.py

Upvotes: 1

Nadav
Nadav

Reputation: 624

You need to understand about queries Django Queries

To show the number of dermatologist:

Doctor.objects.filter(specialization__name="Dermatologist").count()

To show the number of ophthalmologist

Doctor.objects.filter(specialization__name="Ophthalmologist").count()

Upvotes: 0

Related Questions