django 文档上的 pycharm IDE 警告:预期类型"timedelta",'DateTimeField'而不是 python 3.7 pycharm 2019.3



是以下代码片段

from django.db import models
from django.utils import timezone
import datetime

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

Pycharm突出显示self.pub_date并大喊

预期类型为"timedelta",得到的是"DateTimeField"而不是

我该如何摆脱这种情况并把事情做好?

虽然代码是功能性的,但它遇到了PyCharm强调的键入问题。Django收到了一张更正文档的罚单,但在没有执行的情况下被关闭。

该解决方案也在Django票证中,为了完整起见,将其复制到此处。

return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

成为

return self.pub_date >= (timezone.now() - datetime.timedelta(days=1)).timestamp()

使用Steven B.的解决方案时,会引发TypeError异常('datetime.datetime'和'float'的实例之间不支持'>='(。

from django.db import models
from django.utils import timezone
import datetime

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= (datetime.datetime.now() - datetime.timedelta(days=1)).timestamp()

因此,在比较Django中的日期时间时,我们必须记住,默认情况下,日期时间对象在Python中是幼稚的,因此您需要使它们都成为幼稚或可感知的日期时间对象。这一切都归功于Viren Rajput的回答

正因为如此,以下解决方案才能正常工作:

from django.db import models
from django.utils import timezone
import datetime
import pytz

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date >= (timezone.now() - datetime.timedelta(days=1)).replace(tzinfo=pytz.UTC)

注意:如果我们使用timestamp((方法将两个表达式强制转换为float:

from django.db import models
import datetime

class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
def was_published_recently(self):
return self.pub_date.timestamp() >= (datetime.datetime.now() - datetime.timedelta(days=1)).timestamp()

(它可以工作,但PyCharm会指出类"DateTimeField"的警告Unresolved属性引用"timestamp"(

Django版本:3.2.5

最新更新