【问题标题】:How Django QuerySet initialization works?Django QuerySet 初始化如何工作?
【发布时间】:2011-06-13 03:34:12
【问题描述】:

我指的是第一个答案中的代码 sn-p 取自 本帖: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)

这是模型:

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

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    我不完全确定你在这里问什么。

    Inquiry.objects.all()[:5] 不给你对象,它给你一个包含五个元素的单个 QuerySet 对象。

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多