Модели (минимальные):
Код: Выделить всё
# main/models.py
class Category(models.Model):
name = models.CharField(max_length=100)
class SubCategory(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='subcategories')
name = models.CharField(max_length=100)
verification_periodicity = models.IntegerField() # days
class Asset(models.Model):
sub_category = models.ForeignKey(SubCategory, on_delete=models.PROTECT)
last_service = models.DateField(null=True, blank=True)
Вычислить next_service = число дней Last_service + Verification_ periodicity в базе данных, представить его в API и поддержать фильтрацию, например ?next_date__gte=2025-12-06.
Что я пробовал:
- Простое приведение и умножить:
Код: Выделить всё
from django.db.models import ExpressionWrapper, F, DateField, IntegerField
from django.db.models.functions import Cast
qs = qs.annotate(
next_service = ExpressionWrapper(
F('last_service') + Cast(F('sub_category__verification_periodicity'), IntegerField()) * 1,
output_field=DateField()
)
)
- Использование временной разницы Python:
Код: Выделить всё
from datetime import timedelta
qs = qs.annotate(
next_service = F('last_service') + timedelta(days=1) * F('sub_category__verification_periodicity')
)
Ошибки, замеченные по пути:
- когда мне пришлось перемножить два интервала в SQL.
Код: Выделить всё
ProgrammingError: operator does not exist: interval * interval - , что предполагает, что я создал продолжительность, а не дату.
Код: Выделить всё
"next_service": "86400.0"
- Django 5.2.6
- Python 3.11.5
- PostgreSQL (AWS RDS и локальный)
- Пример URL-адреса, который должен работать:
Код: Выделить всё
GET /api/main/assets/?next_date__gte=2025-12-06
- Какое правильное идиоматическое выражение ORM в Django для вычисления дней Last_service + Verification_ periodicity как дата в PostgreSQL?
- Как следует определить выходное_поле, чтобы аннотация представляла собой дату, а не дату продолжительность?
- Как правильно фильтровать по этой аннотированной дате в том же запросе, например next_service__gte=?
Подробнее здесь: https://stackoverflow.com/questions/798 ... and-filter
Мобильная версия