2011-01-21 1 views
1

Я имею в виду фрагмент кода в первом ответе, взятой из этот пост: Custom QuerySet and Manager without breaking DRY?Как работает инициализация Django QuerySet?

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) 

Вот модель:

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) всегда получает ту же модель, но результат QuerySet зависит от ввода QuerySet. Например:

Inquiry.objects.all()[:5].active_for_account(xyz), то active_for_account получит набор запросов из 5 пунктов, в то время как в Inquiry.objects.all()[:7].active_for_account(xyz), active_for_account получит набор запросов из 7 пунктов. Вот трассировка стека:

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) 

Почему результаты (1) и (2) различны?

ответ

1

Я не совсем уверен, что вы здесь просите.

Inquiry.objects.all()[:5] не дает вам давать объекты, он дает вам один объект QuerySet, который содержит пять элементов.