[Django]-How to count the amount of objects in a django joined table?

3πŸ‘

βœ…

In your UserList instead using model, use this queryset:

from django.db.models import Count

class UserList(ListView):
    queryset = Users.objects.annotate(num_assets=Count('assets'))

and define your user field like so:

user = models.ForeignKey('Users', blank=True, null=True, related_name='assets')

then from template:

{{ user.num_assets }}

Also please remember, it’s a good practice to use singular model names, to avoid confusion with reverse relation names..

πŸ‘€mariodev

2πŸ‘

You are doing weird things. Use the related managers that django give you instead. I’ll write the view as a function based view:

views.py

def users_list(request):
    object_list = Users.objects.all()
    render(request, 'mytemplate.html', { 'object_list': object_list })

You can get the counts directly in the template via the RelatedManager:

mytemplate.html

{% for user in object_list %}
 <tr>
     <td>{{ user.id }}</td>
     <td>
         {{ user.assets_set.count }}
     </td>
 </tr>
{% endfor %}

You could also annotate with a count. But learn to float before you swim πŸ™‚

BTW, you should call your models β€œUser” and β€œAsset”, not Users and Assets.

1πŸ‘

You need to use select_related(), count() and pass user instance as argument to class method like so:

@classmethod
def user_assets(cls,user):
    return Assets.objects.select_related('Users').filter(user=user).count()

and then use it like so:

user = Users.objects.all()[0] # some user object (this assumes you have at least one user)
Assets.user_assets(user) 

this should work fine, you can try it in the shell.

In your context this will be used like this:

user = self.model.all()[0] # or get or filter just get some particular user
context['user_assets'] = Assets.user_assets(user)

EDIT: added links, and Users.object.all() instead of Users.object.get(), also added example suited to your specific use case.

πŸ‘€Pawel Miech

Leave a comment