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)的結果不同?