django object has no attribute 'count'

Question:

I am learning django / python and I am stuck on an issue.

I have a view: create_document.py in which I want to count the number of name details from a models class: NameDetails.

I cannot get the correct syntax!

Here is my models.py code:

class NameDetails(FillableModelWithLanguageVersion):
    user = models.ForeignKey(User)
    name_details_prefix_title = models.CharField(null=True, blank=True, max_length=25)
    name_details_first_name = models.CharField(null=False, blank=False, max_length=50)
    name_details_middle_name = models.CharField(null=True, blank=True, max_length=100)
    ....

Here is my create_document.py code in which I have a django wizard. I want to make sure the user has more than 1 name before they can create a document:

from app_name.core.models import NameDetails

class CreateDocumentWizard(SessionWizardView):
    template_name = 'documents/document_create.html'

    form_list = [
        core_forms.CreateDocumentWizardForm01,
        core_forms.CreateDocumentWizardForm02,
        core_forms.CreateDocumentWizardForm03,
        core_forms.CreateDocumentWizardForm04,
    ]

    def get_form_kwargs(self, step=None):
        kwargs = super(CreateDocumentWizard, self).get_form_kwargs(step)
        kwargs.setdefault('user', self.request.user)
        return kwargs

    def get_context_data(self, form, **kwargs):

        name_details_count = NameDetails(user=self.request.user).count()
        if name_details_count < 1:
            return redirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)

When I use the line to determine the count of NameDetails of the user: name_details_count = NameDetails(user=self.request.user).count(), I get the following error:

NameDetails’ object has no attribute ‘count’

I have tried many permutations, but I am stuck.

Asked By: user3354539

||

Answers:

At the moment you’re creating a brand new NameDetails instance with request.user as the user. Instead, you should query the database for existing NameDetails for the current user, and count them. You can query the database through NameDetails.objects:

name_details_count = NameDetails.objects.filter(user=self.request.user).count()
Answered By: knbk

It should be like that in your get_context_data function:

name_details_count = NameDetails.objects.filter(user=self.request.user).count()
Answered By: ddalu5

Each time you need to make a Django QuerySet youhave to go through the object manager objects so : NameDetails.objects. in order to make a count you need a list so you use filter:

name_details_count = NameDetails.objects.filter(user=self.request.user).count()

in case you need one element you use get:

name_details_count = NameDetails.objects.get(user=self.request.user)

for redirection use better HttpResponseRedirect and make sure the link in setting is correct:

return HttpResponseRedirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)
Answered By: Dhia

This is a Python or maybe even more generally, a programming question.

Your line:

name_details_count = NameDetails(user=self.request.user).count()

Is Calling the constructor of the NameDetails class and attempting to call a function count that doesn’t exist on it (hence the error type).

To get a list of all NameDetails instances with that user, you use:

name_details = NameDetails.objects.filter(user=self.request.user)

And to get the number of items in this list, you can simply use the python built-in len() function like so:

name_details_count = len(NameDetails.objects.filter(user=self.request.user))
Answered By: rigdonmr

if wants all recodes count(without any filter) in a collection the use this:

from pymongo import MongoClient
cl = pymongo.MongoClient(host="localhost", port=27017)
db = cl["database_name"]
print(db.get_collection("collection_name").estimated_document_count())
Answered By: Mukul Kirti Verma