Django:将相关字段解析为QuerySet类型



根据官方文档:

# Declare the ForeignKey with related_name
class Tag(models.Model):
article = models.ForeignKey(
Article,
on_delete=models.CASCADE,
related_name="tags"
)
name = models.CharField(max_length=255)
# Return all tags
Article.tags.all()

我的检查器(django-pylint)无法正确输入:Article.tags is Any,我期望QuerySet[Tag].


我可以在Article类中声明Article.tags引用吗?(首选的方法)

from django.db.models.query import QuerySet
class Article(models.Model):
...
# Related field declaration
tags: QuerySet[Tag]
Article.tags.all()

或者我需要每次转换它?

tags_qs: QuerySet[Tag] = Article.tags
tags_qs.all()

在这两种情况下,为每个相关字段实现看起来很繁重。


当然,这更多的是一个舒适的开发体验问题,而不是一个关键问题。目标是允许我的过滤器和其他自动补全/发现工具将相关字段解析为QuerySet[T]类型。也许我不能由于Python实现的设计,而不是Django的问题。

是否有其他替代方案来解决这个问题?

感谢@Anentropic给我指明了正确的方向,我选择了django-types。这个库可以很容易地与VS Code和PyLance扩展(它使用PyRight类型检查,而不是MyPY)集成。

设置VS Code

克隆django-types
  1. django_stubs重命名为django
  2. 移动到项目文件夹
  3. ./typings/django

改编以下说明:https://github.com/sbdchd/django-types#usage

from __future__ import annotations  # or just be in python 3.11
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from django.db.models import Manager
class Article(models.Model):
tags: Manager["Tag"]
# Declare the ForeignKey with related_name
class Tag(models.Model):
article = models.ForeignKey(
Article,
on_delete=models.CASCADE,
related_name="tags"
)
name = models.CharField(max_length=255)
# Return all tags
Article.tags.all()

现在,PyLance工作正常与自动完成!

最新更新