在django模型UTIL中使用PassThroughManager时重写.all()返回的对象?

在django模型UTIL中使用PassThroughManager时重写.all()返回的对象?,django,model,Django,Model,我想用 . 示例介绍了如何定义自定义管理器方法,但找不到有关如何更改默认queryset(即objects.all())的信息 如何指定使用PassThroughManager时我的objects.all()将返回什么 ---编辑-- 对于未来的读者, django 1.7似乎内置了PassThroughManager 您不能在自定义QuerySet上覆盖all()方法吗 class PostQuerySet(QuerySet): def all(self): ...

我想用 .

示例介绍了如何定义自定义管理器方法,但找不到有关如何更改默认queryset(即objects.all())的信息

如何指定使用PassThroughManager时我的objects.all()将返回什么

---编辑--

对于未来的读者, django 1.7似乎内置了PassThroughManager


您不能在自定义
QuerySet
上覆盖
all()
方法吗

class PostQuerySet(QuerySet):
    def all(self):
        ...

您不能在自定义的
QuerySet
上重写
all()
方法吗

class PostQuerySet(QuerySet):
    def all(self):
        ...

请参阅@jproffitt答案,但如果您确实需要在manager中定义该方法

我想你可以做到:

from django.db import models 
from django.db.models.query import QuerySet
from model_utils import managers


class MyManager(models.Manager):
    def all(self):
        # ... Your custom method

class MyQuerySet(QuerySet):
    pass

MyThThroughManager = managers.create_pass_through_manager_for_queryset_class(MyManager, MyQuerySet)

我看到了和

看到了@jproffitt的答案,但是如果您真的需要在manager中定义该方法

我想你可以做到:

from django.db import models 
from django.db.models.query import QuerySet
from model_utils import managers


class MyManager(models.Manager):
    def all(self):
        # ... Your custom method

class MyQuerySet(QuerySet):
    pass

MyThThroughManager = managers.create_pass_through_manager_for_queryset_class(MyManager, MyQuerySet)

从Django 3.0+开始,我看到了and

,您不能再覆盖QuerySet中的
all
函数。无需使用任何第三方的最新解决方案是:

from django.db import models

class CustomQuerySet(models.query.QuerySet):
    pass

class CustomManager(models.Manager):
    def get_queryset(self):
        qs = CustomQuerySet(self.model, using=self._db)
        return qs.filter(...)    # your custom logic here

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

从Django 3.0+开始,您不能再覆盖QuerySet中的
all
函数。无需使用任何第三方的最新解决方案是:

from django.db import models

class CustomQuerySet(models.query.QuerySet):
    pass

class CustomManager(models.Manager):
    def get_queryset(self):
        qs = CustomQuerySet(self.model, using=self._db)
        return qs.filter(...)    # your custom logic here

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

是的,考虑过,但是没有看到这样做的例子,所以我害怕这样做。(网络覆盖管理器的get_queryset方法上的大多数示例)。而且克隆的东西让我担心。。我个人不会覆盖
get_queryset
all
,因为这些都在django的其他地方使用。覆盖默认行为总是有风险的。现在你的管理员将不会显示所有内容。这将不再适用于Django 3.0+是的,考虑过了,但是没有看到一个这样做的示例,所以我很害怕。(网络覆盖管理器的get_queryset方法上的大多数示例)。而且克隆的东西让我担心。。我个人不会覆盖
get_queryset
all
,因为这些都在django的其他地方使用。覆盖默认行为总是有风险的。现在你的管理员不会显示所有内容。这将不再适用于Django3.0+