为什么这两个 Django 模型对象的 VSCode 智能感知类型提示不同?

Why is VSCode intellisense type hints different for these 2 Django model objects?

在导入 Video 模型后的 views.py 中,我正在测试智能感知在 VScode 中的工作方式。

这是views.py

from django.shortcuts import render
from .models import Video


# Create your views here.
video1: Video = Video.objects.get(id=1)
video2: Video = Video.objects.filter(id=1).first()

这是 models.py:

class Video(models.Model):
    '''
    info about videos
    '''
    video_id = models.TextField(blank=True, null=True)
    title = models.TextField()
    description = models.TextField()
    tags = models.TextField()
    is_uploaded = models.BooleanField()
    date_uploaded = models.DateField(null=True)
    filename = models.TextField()
    thumbnail_filename = models.TextField()

当我开始打字时,我从 video1: Video = Video.objects.get(id=1) 得到 video1

如您所见,它提供了模型字段

但是对于来自 video2: Video = Video.objects.filter(id=1).first()video2

它不提供模型字段。

为什么会这样,我们该如何解决?

第一个知道它正在获取单个模型实例,因为它由 QuerySet 保证。我认为第二个不保证return一个模型实例。

在 django 源代码中:

def first(self):
        """Return the first object of a query or None if no match is found."""
        for obj in (self if self.ordered else self.order_by('pk'))[:1]:
            return obj

所以它是 returning Optional[<instance>]get() return 是一个实例。

有趣的是,earliest 可能适用于您的用例,并且在子调用 get.

时保证 return 模型实例