Django 使用自定义QuerySet作为管理器向所有QuerySet添加注释

Django 使用自定义QuerySet作为管理器向所有QuerySet添加注释,django,django-models,Django,Django Models,我不知道如何准确地描述这个问题,但我试图做的是为模型使用自定义查询集,但我想对任何查询集的结果进行注释。因此,无论是应用过滤器,还是直接获取对象(我认为最终仍然是一个filter()调用),我都希望应用注释,以便在获取的模型对象中访问它们 我当前的解决方案是使用自定义QuerySet+自定义管理器,自定义管理器将自定义调用传递给自定义QuerySet上的相应调用。当然,不幸的是,这需要为我想要的任何自定义方法匹配manager和queryset之间的方法 我知道,CustomQuerySet.a

我不知道如何准确地描述这个问题,但我试图做的是为模型使用自定义查询集,但我想对任何查询集的结果进行注释。因此,无论是应用过滤器,还是直接获取对象(我认为最终仍然是一个filter()调用),我都希望应用注释,以便在获取的模型对象中访问它们

我当前的解决方案是使用自定义QuerySet+自定义管理器,自定义管理器将自定义调用传递给自定义QuerySet上的相应调用。当然,不幸的是,这需要为我想要的任何自定义方法匹配manager和queryset之间的方法

我知道,
CustomQuerySet.as\u manager()
的存在是为了避免这种重复,但是如果我使用它,那么我就失去了覆盖get\u queryset()的能力,因此我的注释可以应用于计算queryset的所有情况

是否有一种更干净的方法来实现这一点,这样我仍然能够在最终评估queryset时链接调用并应用注释

理想情况下,我希望继续使用标准呼叫,如:
Model.objects.most_like().near()
Model.objects.get(id=Model\u id)

与向自定义查询集中添加add_annotations()方法相反,我需要在获取模型对象时始终调用该方法(即,我不希望
Model.objects.get(id=id).add_annotations()
Model.objects.near().add_annotations()
等等)

但不必在manager和queryset之间重复这些方法?理想情况下,不要侵入私有方法或类似的东西。我曾短暂地玩弄过在CustomQuerySet类上覆盖
\uuuuu iter\uuuuu
来添加注释,但这样做似乎不对

下面是模型、查询集和管理器的示例设置。这些当然不是我的真名,只是问题的补充。希望我包含的内容足够让我的问题可以理解:)

您应该使用该方法-它允许您创建一个Manager类,您可以在应用到模型之前进一步自定义该类。例如:

class CustomQuerySet(models.QuerySet):
    def most_liked(self):
        return self.filter(...)


class CustomManager(models.Manager.from_queryset(CustomQuerySet)):
    def get_queryset(self):
        return super(CustomManager, self).get_queryset() \
            .annotate(...)


class Model(models.Model):
    objects = CustomManager()

太棒了,成功了!尽管我将get\u queryset()方法保留为:
def get\u queryset(self):返回CustomQuerySet(self.model,使用=self.\u db)\.annotate(…)\.annotate(…)
您所做的更改导致了无限递归。在get_queryset()中,是否有什么事情是我做错了的,就像我上面所说的那样?嗯,我打了一个错别字(缺少括号)-现在对你有用吗?确实有用。也比我在那里做的更有意义。在你的帮助下,我的大脑被我想做的事情弄得有点扭曲了。非常感谢你!
class CustomQuerySet(models.QuerySet):
    def most_liked(self):
        return self.filter(...)


class CustomManager(models.Manager.from_queryset(CustomQuerySet)):
    def get_queryset(self):
        return super(CustomManager, self).get_queryset() \
            .annotate(...)


class Model(models.Model):
    objects = CustomManager()