是以下代码片段
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