在 Django 中我有自定义
QuerySet
和 Manager
:
from django.db import models
class CustomQuerySet(models.QuerySet):
def live(self):
return self.filter(is_draft=False)
class CustomManager(models.Manager):
def publish(self, instance: "MyModel"):
instance.is_draft = False
instance.save()
在我的模型中我想同时使用两者,所以我使用
from_queryset
方法:
class MyModel(models.Model):
objects: CustomManager = CustomManager().from_queryset(CustomQuerySet)()
is_draft = models.BooleanField(blank=True, default=True)
自从我将
objects
注释为 CustomManager
以来,Pylance(通过 vscode)逻辑上对我大喊 MyModel.objects.live()
是错误的,因为 Cannot access attribute "live" for class "CustomManager" Attribute "live" is unknown
。
删除类型注释会导致类似的抱怨:
Cannot access attribute "live" for class "BaseManager[MyModel]" Attribute "live" is unknown
。
如何在
objects
中注释 MyModel
,以便 Pylance 知道 objects
还有可用的 CustomQuerySet
方法,而不仅仅是 CustomManager
方法?
将
publish(..)
放在经理级别似乎没有多大意义,因为人们可能想发布各种 QuerySet
。
您通常在
QuerySet
上定义它:
class CustomQuerySet(models.QuerySet):
def live(self) -> CustomQuerySet['MyModel']:
return self.filter(is_draft=False)
def publish(self):
return self.update(is_draft=False)
然后将
CustomQuerySet
注入:
class MyModel(models.Model):
objects: QuerySet['MyModel'] = CustomQuerySet.as_manager()
然后您可以使用
QuerySet
发布一组项目,例如:
MyModel.objects.filter(pk=1).publish()