В views.py
после импорта модели Video
я тестирую, как работает intellisense в 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
, которое от video1: Video = Video.objects.get(id=1)
:
Как видите, он предлагает поля модели
но для video2
, который из video2: Video = Video.objects.filter(id=1).first()
:
он не предлагает поля модели.
Почему так и как мы можем это исправить?
Первый знает, что он получает единственный экземпляр модели, поскольку это гарантируется QuerySet. Я думаю, что второй не гарантирует возврат экземпляра модели.
В исходном коде 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
поэтому он возвращает Optional[<instance>]
, тогда как get()
возвращает экземпляр.
Интересно, что earliest
может работать для вашего варианта использования, и он гарантированно возвращает экземпляр модели при подвызове get
.
да интересно, самая ранняя работает нормально