How Django QuerySet initialization works?

11,510

I'm not entirely sure what you're asking here.

Inquiry.objects.all()[:5] doesn't give you give objects, it gives you a single QuerySet object which contains five elements.

Share:
11,510
wakandan
Author by

wakandan

Updated on June 04, 2022

Comments

  • wakandan
    wakandan almost 2 years

    I'm referring to the code snippet in the first answer taken from this post: Custom QuerySet and Manager without breaking DRY?

    from django.db import models
    from django.db.models.query import QuerySet
    
        class CustomQuerySetManager(models.Manager):
            """A re-usable Manager to access a custom QuerySet"""
            def __getattr__(self, attr, *args):
                try:
                    return getattr(self.__class__, attr, *args)
                except AttributeError:
                    return getattr(self.get_query_set(), attr, *args)
    
            def get_query_set(self):
                return self.model.QuerySet(self.model)
    

    Here is the model:

    from custom_queryset.models import CustomQuerySetManager
    from django.db.models.query import QuerySet
    
    class Inquiry(models.Model):
        objects = CustomQuerySetManager()
    
        class QuerySet(QuerySet):
            def active_for_account(self, account):
                self.filter(account = account, deleted=False, *args, **kwargs)
    

    self.model.QuerySet(self.model) always receives a same model, but the result QuerySet depends on the input QuerySet. For example:

    Inquiry.objects.all()[:5].active_for_account(xyz), then active_for_account will receive a query set of 5 items, while in Inquiry.objects.all()[:7].active_for_account(xyz), active_for_account will receive a query set of 7 items. Here are stack traces:

    Inquiry.objects.all()[:5].active_for_account(xyz) 
        return getattr(self.get_query_set(), attr, *args),
           return self.model.QuerySet(self.model)   (1)
    
    Inquiry.objects.all()[:7].active_for_account(xyz) 
        return getattr(self.get_query_set(), attr, *args),
           return self.model.QuerySet(self.model)   (2)
    

    Why are results at (1) and (2) different?