# Ordering by model\_set in @admin.display

**URL:** <https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548>\
**Category:** The Admin\
**Created:** [October 19, 2022, 1:48pm UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548 "2022-10-19T13:48:14Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![sandybo](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/sandybo/32/10449_2.png) [@sandybo](https://forum.djangoproject.com/u/sandybo)\
**Post date:** [October 19, 2022, 1:48pm UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/1 "2022-10-19T13:48:14Z")

</div>

Hello,  
I have a small app of type “Countries =\> City” as reported below:

```auto
# models.py
class Country(models.Model):
	name = models.CharField(max_length=150, help_text="Country name")
	iso2 = models.CharField(max_length=2, help_text="Country ISO2")
	iso3 = models.CharField(max_length=3, help_text="Country ISO3")

class City(models.Model):
	name = models.CharField(max_length=150, help_text="City name")
	country = models.ForeignKey('Country', on_delete=models.SET_NULL, null=True, blank=True)

```

and in `admin.py` I set City `@admin.display` as below:

```auto
@admin.register(Country)
class CountryAdmin(admin.ModelAdmin):
	list_display = ('id', 'name', 'get_cities', 'iso2', 'iso3')

	@admin.display(description='Cities', ordering='city')
	def get_cities(self, obj):
		count_results = obj.city_set.count()
		return format_html('<a href="{0}?country__id={1}">{2}</a>'.format( reverse("admin:myapp_city_changelist"), obj.pk, count_results ) )	

```

It partially works since it shows duplicates countries (See “Brazil” and “France” in attached image):

 ![immagine](https://us1.discourse-cdn.com/flex026/uploads/djangoproject/original/2X/9/9fd5a8a208a7c737e476171ad566ceef6488a9b5.png)

I also tried to type `@admin.display(description='Cities', ordering='city_set.count')` but it fails.

---

<div class="post-metadata">

**Author:** ![leandrodesouzadev](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/leandrodesouzadev/32/8981_2.png) [@leandrodesouzadev](https://forum.djangoproject.com/u/leandrodesouzadev)\
**Post date:** [October 19, 2022, 3:21pm UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/2 "2022-10-19T15:21:13Z")

</div>

Hey there!  
Maybe you can get around this overriding the `get_queryset` method.

```auto
from django.db.models import Count

@admin.register(Country)
class CountryAdmin(admin.ModelAdmin):
	list_display = ('id', 'name', 'get_cities', 'iso2', 'iso3')

	@admin.display(description='Cities', ordering='city')
	def get_cities(self, obj):
		# count_results = obj.city_set.count()
        # this is no longer needed, since the value is annotated on the queryset
		return format_html('<a href="{0}?country__id={1}">{2}</a>'.format( reverse("admin:myapp_city_changelist"), obj.pk, obj.city_count ))
        
    def get_queryset(self, request):
        return super().get_queryset(request).annotate(city_count=Count("city_set")).order_by("-city_count")

```

---

<div class="post-metadata">

**Author:** ![sandybo](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/sandybo/32/10449_2.png) [@sandybo](https://forum.djangoproject.com/u/sandybo)\
**Post date:** [October 19, 2022, 3:30pm UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/3 "2022-10-19T15:30:58Z")

</div>

Hi!

unfortunately it doesn’t work due to following errors:

1. Cannot resolve keyword ‘city\_set’ into field. Choices are: continent, id, iso2, iso3, iso\_numeric, name, tld, city. If I edit `city_set` to `city` I obtain following error
2. name ‘city\_count’ is not defined

---

<div class="post-metadata">

**Author:** ![leandrodesouzadev](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/leandrodesouzadev/32/8981_2.png) [@leandrodesouzadev](https://forum.djangoproject.com/u/leandrodesouzadev)\
**Post date:** [October 19, 2022, 4:24pm UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/4 "2022-10-19T16:24:21Z")

</div>

Oops, my bad.  
What about:

```auto
def get_queryset(self, request):
        return super().get_queryset(request).annotate(city_count=Count("city_set__id")).order_by("-city_count")

```

---

<div class="post-metadata">

**Author:** ![sandybo](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/sandybo/32/10449_2.png) [@sandybo](https://forum.djangoproject.com/u/sandybo)\
**Post date:** [October 19, 2022, 5:17pm UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/5 "2022-10-19T17:17:51Z")

</div>

unfortunately the issue remains and I have the same error:

> Cannot resolve keyword ‘city\_set’ into field. Choices are: continent, id, iso2, iso3, iso\_numeric, name, tld, city

---

<div class="post-metadata">

**Author:** ![leandrodesouzadev](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/leandrodesouzadev/32/8981_2.png) [@leandrodesouzadev](https://forum.djangoproject.com/u/leandrodesouzadev)\
**Post date:** [October 19, 2022, 5:42pm UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/6 "2022-10-19T17:42:43Z")

</div>

That’s strange, i used to do this a lot. Can you add this to your country `fk`?

```auto
class City(models.Model):
	name = models.CharField(max_length=150, help_text="City name")
	country = models.ForeignKey('Country', on_delete=models.SET_NULL, null=True, blank=True,
related_name="cities" # <- This
)

# On the admin get_queryset
    def get_queryset(self, request):
        return super().get_queryset(request).annotate(city_count=Count("cities")).order_by("-city_count")

```

---

<div class="post-metadata">

**Author:** ![sandybo](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/sandybo/32/10449_2.png) [@sandybo](https://forum.djangoproject.com/u/sandybo)\
**Post date:** [October 20, 2022, 7:58am UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/7 "2022-10-20T07:58:26Z")

</div>

> [@leandrodesouzadev](#):
>
> `@admin.display(description='Cities', ordering='city')`

Now it works!  
So, automatic ordering does not seems to work in `@admin.display(description='Cities', ordering='cities_count')`. Howewer, If I click on “cities” column 3 times it works.

Furthermore, I had to put `cities_count` in ordering since if I put `cities`, I have the duplicates.

---

<div class="post-metadata">

**Author:** ![sandybo](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/sandybo/32/10449_2.png) [@sandybo](https://forum.djangoproject.com/u/sandybo)\
**Post date:** [October 25, 2022, 1:32pm UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/8 "2022-10-25T13:32:44Z")

</div>

Hi @leandrodesouzadev,  
can you tell me how to automatically order by `cities_count`?

---

<div class="post-metadata">

**Author:** ![leandrodesouzadev](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/leandrodesouzadev/32/8981_2.png) [@leandrodesouzadev](https://forum.djangoproject.com/u/leandrodesouzadev)\
**Post date:** [October 25, 2022, 1:35pm UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/9 "2022-10-25T13:35:42Z")

</div>

What do you mean by automatically?

---

<div class="post-metadata">

**Author:** ![sandybo](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.djangoproject.com/sandybo/32/10449_2.png) [@sandybo](https://forum.djangoproject.com/u/sandybo)\
**Post date:** [October 26, 2022, 7:24am UTC](https://forum.djangoproject.com/t/ordering-by-model-set-in-admin-display/16548/10 "2022-10-26T07:24:59Z")

</div>

When I go to `admin/model/country/`, I wish to have Countries by `cities_count` desc. I have to on “cities” column 3 times to have correct ordering.
