Как работает инициализация Django QuerySet? - PullRequest
1 голос
/ 21 января 2011

Я имею в виду фрагмент кода в первом ответе, взятом из этот пост: Пользовательский QuerySet и Manager без прерывания 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)

Вот модель:

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 Ответ

1 голос
/ 21 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...