В моем проекте Django у меня есть файл models.py, который выглядит следующим образом:

from django.db import models

class Battle(models.Model):

    def __str__(self):
        return self.battle_name

    battle_name = models.CharField(max_length=200)
    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    password = models.CharField(max_length=50)

Когда я захожу в оболочку Django (python manage.py shell), я не могу взаимодействовать ни с одним из свойств DateTimeField.

$ python manage.py shell
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from battles.models import Battle
>>> Battle.objects.all()
<QuerySet [<Battle: my first battle>, <Battle: Take back the motherland>, <Battle: this is the big one>]>
>>> Battle.objects.filter(battle_name='my first battle')
<QuerySet [<Battle: my first battle>]>
>>> import datetime
>>> Battle.objects.filter(end_time<datetime.datetime.now())
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'end_time' is not defined
>>> Battle.objects.filter(end_time < datetime.datetime.now())
Traceback (most recent call last):
  File "<console>", line 1, in <module>
NameError: name 'end_time' is not defined

Я что-то упускаю?

0
Dan S 29 Май 2019 в 17:18

2 ответа

Лучший ответ

Позвольте мне добавить немного пояснений.

Battle.objects.filter(end_time < datetime.datetime.now())

Здесь filter() - вызываемый объект, который принимает аргументы (args или kwargs). С помощью приведенного выше кода вы пытаетесь передать логическое значение (object < object) в фильтр, вызываемый в качестве аргумента. Теперь, булево значение True или False указывает что-либо о поле модели?

Что вы должны сделать, это передать аргумент ключевого слова, а именно

Battle.objects.filter(end_time__lt=datetime.datetime.now())

Теперь filter() получает необходимую информацию, параметр kwarg end_time__lt (который задает поле модели вместе с методом сравнения) и значение, которое необходимо сравнить с datetime.datetime.now()

3
Jahid 29 Май 2019 в 14:43

Вы делаете синтаксическую ошибку

Попробуйте это

Battle.objects.filter(end_time__lt=datetime.datetime.now())
3
shafik 29 Май 2019 в 14:19