Пытаясь удалить все объекты старше 7 дней в django, я продолжаю получать TypeError: неупорядоченные типы: DeferredAttribute () <datetime.datetime () - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь создать веб-страницу, которая отображает состояние, которое загружается на сервер MySQL со звукового датчика.

Я пробовал много разных вариантов выбора, но, похоже, ни один из них не работает.

Когда я создавал свой первый проект Django, я следовал руководству и их примеру, казалось, что выбор объектов, созданных в последний день, работал.

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

В моем проекте я просто поменял дни на 7 и изменил вокруг> = на <. Затем я начал получать «TypeError: неупорядоченные типы: DeferredAttribute () <datetime.datetime ()». </p>

My models.py:

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)

My views.py, где я вызываю эту функцию:

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")

Я хочу, чтобы программа (как указано выше) удаляла все объекты старше 7 дней, но по какой-то причине я получаю эту ошибку. Из этого я понял, что сравниваю две несопоставимые переменные, но я не знаю, как это исправить, и даже не знаю, верны ли мои предположения об этом.

Может ли это иметь какое-то отношение к дате, добавляемой в таблицу из другой малины, например:

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()

(состояние «открыто» или «закрыто»)

Буду очень благодарен за любую помощь! Если есть что-то необходимое для решения этой проблемы, которое я не предоставил, я был бы рад предоставить это.

1 Ответ

2 голосов
/ 31 марта 2019

Нет, это не имеет никакого отношения к тому, как данные были вставлены.Дело в том, что вы не выполняете запрос.

Ваш метод должен быть вызван для экземпляра garage_door и будет возвращать, если этот конкретный экземпляр старше семи дней.Но вы вызываете его на 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.

...