如何注释Manager().from_queryset()的类型?

问题描述 投票:0回答:1

在 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
方法?

python django django-orm python-typing pylance
1个回答
0
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.