Вопрос о сортировке по дате внутри базы данных с помощью Django
У меня есть база данных, в которой можно найти товары по их названию. В БД определены ID, категория, название, количество и дата, и я пытался создать отдельное поле поиска, которое позволило бы мне искать эти товары по дате их добавления.
Модель models.py выглядит следующим образом:
class Expense(models.Model):
class Meta:
ordering = ('-date', '-pk')
category = models.ForeignKey(Category, models.PROTECT, null=True, blank=True)
name = models.CharField(max_length=50)
amount = models.DecimalField(max_digits=8, decimal_places=2)
date = models.DateField(default=datetime.date.today, db_index=True)
def __str__(self):
return f'{self.date} {self.name} {self.amount}'
А views.py выглядит следующим образом:
class ExpenseListView(ListView):
model = Expense
paginate_by = 5
def get_context_data(self, *, object_list=None, **kwargs):
queryset = object_list if object_list is not None else self.object_list
form = ExpenseSearchForm(self.request.GET)
if form.is_valid():
name = form.cleaned_data.get('name', '').strip()
if name:
queryset = queryset.filter(name__icontains=name)
return super().get_context_data(
form=form,
object_list=queryset,
summary_per_category=summary_per_category(queryset),
**kwargs)
Я добавил поле "date" под "name", следуя его структуре, но я продолжал получать ошибку 'datetime.date' object has no attribute 'strip'. Существует ли другой формат для определения даты? Когда я также добавил ее в поле поиска в forms.py, она была видна там как строка.
Я также нашел похожий пост Как сделать фильтр по диапазону дат в Django? , но он не объяснил так много, даже после поиска в официальной библиотеке. Я очень новичок в Django, и я не уверен, что для поиска по дате тоже должен быть отдельный вызов queryset.
В form.is_valid() я пытался добавить поле даты, но постоянно получал ошибку 'datetime.date' object has no attribute 'strip'.
DateField
field_name = DateField(auto_now=False, auto_now_add=False, **options)
Я думаю, что поведение, которое вы ищете, описано в документации django здесь:
DateField.auto_now
Автоматически устанавливает поле в now при каждом сохранении объекта. Полезно для временных меток "last-modified". Обратите внимание, что текущая дата используется всегда; это не просто значение по умолчанию, которое можно переопределить.
Поле автоматически обновляется только при вызове функции Model.save()
. Поле не обновляется при обновлении других полей другими способами, такими как QuerySet.update()
, хотя вы можете указать пользовательское значение для поля при таком обновлении.
DateField.auto_now_add
Автоматически устанавливает поле в значение now при первом создании объекта. Полезно для создания временных меток. Обратите внимание, что текущая дата используется всегда; это не просто значение по умолчанию, которое можно переопределить. Поэтому даже если вы зададите значение для этого поля при создании объекта, оно будет проигнорировано. Если вы хотите иметь возможность изменять это поле, установите вместо auto_now_add=True
следующие значения:
default=date.today - from datetime.date.today()
<
default=timezone.now - from django.utils.timezone.now()
Виджет формы по умолчанию для этого поля - DateInput
. Админ добавляет календарь JavaScript, и ярлык для "Сегодня". Включает дополнительный ключ сообщения об ошибке invalid_date
.