根据官方文档:
# 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- 将
django_stubs
重命名为django
- 移动到项目文件夹 的
./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工作正常与自动完成!