按日期"operator does not exist: date >= integer"过滤时的 Django 错误



我使用的是带有postgresql的django框架。我有虚拟环境。我的本地机器Mac,服务器在Debian 10上。

$ pip freeze
amqp==5.0.6
asgiref==3.4.1
billiard==3.6.4.0
celery==5.1.2
certifi==2021.5.30
chardet==4.0.0
click==7.1.2
click-didyoumean==0.0.3
click-plugins==1.1.1
click-repl==0.2.0
Django==3.2.5
django-celery-beat==2.2.1
django-celery-results==2.2.0
django-timezone-field==4.1.2
greenlet==1.1.0
idna==2.10
kombu==5.1.0
lxml==4.6.3
multitasking==0.0.9
numpy==1.21.0
pandas==1.3.0
plotly==5.1.0
prompt-toolkit==3.0.19
psycopg2==2.9.1
psycopg2-binary==2.9.1
python-crontab==2.5.1
python-dateutil==2.8.1
pytz==2021.1
requests==2.25.1
six==1.16.0
SQLAlchemy==1.4.20
sqlparse==0.4.1
tenacity==7.0.0
urllib3==1.26.6
vine==5.0.0
wcwidth==0.2.5
yfinance==0.1.60

型号.py

from django.db import models
from django.utils import timezone
class Ticker(models.Model):
symbol = models.CharField(max_length=12)
description = models.CharField(max_length=100, blank=True, default='')
avg_volume = models.DecimalField(max_digits=20, decimal_places=6)
last_close_price = models.DecimalField(max_digits=20, decimal_places=6, default=0)
last_update_date = models.DateField(default=timezone.now)
def __str__(self):
return self.symbol
class TickerData(models.Model):
date = models.DateField(default=timezone.now)
open_price = models.DecimalField(max_digits=20, decimal_places=6)
high_price = models.DecimalField(max_digits=20, decimal_places=6)
low_price = models.DecimalField(max_digits=20, decimal_places=6)
close_price = models.DecimalField(max_digits=20, decimal_places=6)
adj_close = models.DecimalField(max_digits=20, decimal_places=6)
volume = models.IntegerField()
symbol = models.ForeignKey(Ticker, on_delete=models.CASCADE, related_name='infoset')
def __str__(self):
return f'{self.symbol}: {self.date}'

views.py

from datetime import date, datetime, timedelta
from django.db import connection
from django.shortcuts import render, get_object_or_404
from .models import Ticker, TickerData
def ticker_data_view(request, pk):
# dates
enddate = date.today()
startdatedays = enddate - timedelta(days=180)
ticker = Ticker.objects.get(pk=pk)
ticker_info = TickerData.objects.filter(symbol=ticker).filter(date__gte=startdatedays)

context = {
'TickerData': ticker_info,
}

return render(request, 'tickerdata_list.html', context)

当我打开带有信息的页面时

DatabaseError at /ticker/2 Execution failed on sql 'SELECT "webapp_tickerdata"."id", "webapp_tickerdata"."date", "webapp_tickerdata"."open_price", "webapp_tickerdata"."high_price", "webapp_tickerdata"."low_price", "webapp_tickerdata"."close_price", "webapp_tickerdata"."adj_close", "webapp_tickerdata"."volume", "webapp_tickerdata"."symbol_id" FROM "webapp_tickerdata" WHERE ("webapp_tickerdata"."symbol_id" = 2 AND "webapp_tickerdata"."date" >= 2021-01-09)': operator does not exist: date >= integer LINE 1: ...a"."symbol_id" = 2 AND "webapp_tickerdata"."date" >= 2021-01...
^ HINT:  No operator matches the given name and argument types. You might need to add explicit type casts.

有人能帮忙吗。

更新

我想我的postgres正在等待报价中的日期,比如:

AND "webapp_tickerdata"."date" >= '2021-01-09'

我直接尝试过,只需选择这样的参数就可以了。也许我需要更改postgress中的设置?

我认为问题出在这一行

date = models.DateField(default=timezone.now)

您使用日期字段,但timezone.now会为您提供日期和时间像一样更改

import datetime 
date = models.DateField(default=datetime.date.today)

或者这可能也适用于

date = models.DateField(default=timezone.now.date)

最新更新