我正在尝试创建一个显示状态的网页,该状态已从声音传感器上传到MySQL服务器。
我尝试了许多不同的选择安排,但似乎都没有用。
当我创建第一个Django项目时,我遵循了本教程及其示例,选择过去一天创建的对象似乎可行。
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
在我的项目中,我将天数更改为7,而将> =更改为<。然后我开始得到“ TypeError:不可排序的类型:DeferredAttribute() 我的模型。py: 我在views.py中调用此函数的位置: 我希望程序(如上所述)删除所有早于7天的对象,但是由于某种原因,出现此错误。我从中得到的是,我正在比较两个无法比较的变量,但是我不知道如何解决这个问题,我什至不知道我对此的猜测是否正确。 这与从其他树莓派中添加到表中的日期有关吗? (状态为“打开”或“关闭”) 我将非常感谢您的帮助!如果有需要解决的问题(我没有提供),我将很乐意提供。from django.db import models
import datetime
from django.utils import timezone
class garage_door(models.Model):
date = models.DateTimeField(auto_now_add=True)
state = models.CharField(max_length=6)
def __str__(self):
return str(self.date)[:19]
def select_old(self):
return self.date < timezone.now() - datetime.timedelta(days=7)
from django.shortcuts import render
from django.http import HttpResponse
from dash.models import garage_door
def dashboard(request):
garage_door.select_old(garage_door).delete()
return HttpResponese("Temp Response")
sql = "INSERT INTO dash_garage_door(date, state) VALUES(%s, %s)"
now = datetime.datetime.now()
val = (now, g_state)
mycursor.execute(sql, val)
mydb.commit()
答案 0 :(得分:1)
否,它与插入数据的方式无关。就是您没有在查询。
您的方法需要在garage_door的 instance 上调用,并将返回该特定实例是否已存在7天以上。但是您在 class 上调用它,显然希望它会在数据库中查询所有匹配项。但这根本不是Django的工作方式。
您需要在过滤器表达式中执行此操作:
seven_days_ago = timezone.now() - datetime.timedelta(days=7)
garage_door.objects.filter(date__lt=seven_days_ago)
您可以将其包装到自定义管理器中:
class GarageManager(models.Manager):
def select_old(self):
seven_days_ago = timezone.now() - datetime.timedelta(days=7)
return self.filter(date__lt=seven_days_ago)
class garage_door(models.Model):
...
objects = GarageManager()
现在您可以这样做:
garage_door.objects.select_old().delete()
请注意,根据Python样式,您的模型应命名为GarageDoor
,而不是garage_door
。