Django DatabaseError Неверный коннектор для timedelta
Ранее я реализовал ExpressionWrapper
для создания пользовательского фильтра, он отлично работает в postgresql, но когда я запустил тест с sqlite3, то появилась ошибка django.db.utils.DatabaseError: Invalid connector for timedelta: *.
.
class AccessDurationQuerySet(models.QuerySet):
def filter_expiration(self, is_expired: bool = False):
"""
To filter whether AccessDuration already expired or yet.
don't use the same `expiration_date` as expression key,
because it will clash with `AccessDuration.expiration_date` property.
Issue: https://stackoverflow.com/q/69012110/6396981
"""
kwargs = {'_expiration_date__gte': Now()}
if is_expired:
del kwargs['_expiration_date__gte']
kwargs['_expiration_date__lt'] = Now()
return self.all().annotate(
_expiration_date=models.ExpressionWrapper(
models.F('lab_start_date') + (timezone.timedelta(days=1) * models.F('duration')),
output_field=models.DateTimeField()
)
).filter(**kwargs)
class AccessDurationManager(
models.Manager.from_queryset(AccessDurationQuerySet),
DefaultManager
):
def published(self):
return super().published().filter(
status=AccessDurationStatusChoices.active
)
class AccessDuration(TimeStampedModel):
course = models.CharField(max_length=100)
duration = models.FloatField(default=settings.DEFAULT_DURATION,
help_text=_('In days'))
container_duration = models.CharField(max_length=100,
default=_('Up 2 hours'),
help_text=_('How long a container has to be running, '
'value based on Docker API Status'))
user = models.ForeignKey(User, on_delete=models.CASCADE)
lab_start_date = models.DateTimeField(verbose_name=('Start Date'),
null=True)
status = models.CharField(max_length=20,
choices=AccessDurationStatusChoices.choices,
default=AccessDurationStatusChoices.inactive)
objects = AccessDurationManager()
...
В любом случае, я использую docker для своего проекта:
docker-compose -f local.yml run django pytest myproject/tests/flows/2_test_invite_student.py::test_invite_student_by_superuser
Затем ошибка гласила:
Соединители умножения и деления для выражений длительности не поддерживаются на SQLite и MySQL.
подробнее об этом можно прочитать по следующей ссылке https://code.djangoproject.com/ticket/25287
Согласно https://github.com/django/django/pull/14237 некоторые из этих функций теперь поддерживаются, по крайней мере, в SQLite. Вам следует попробовать более свежую версию django, чтобы использовать это. Согласно документации, это должно быть возможно на django 4.0. Так что попробуйте django==4.0rc1, чтобы это заработало.
Добавлена поддержка умножения и деления DurationField на скалярные значения на SQLite.