Как получить среднее значение двух полей даты
Я хочу вычесть время создания объекта результата пользователя и время регистрации пользователя. вот мои модели:
class User(AbstractUser):
id = models.AutoField(primary_key=True)
created_at = models.DateTimeField(auto_now_add=True)
username = models.CharField(unique=True, max_length=13)
first_name = models.CharField(max_length=32, null=True, default=None)
last_name = models.CharField(max_length=64, null=True, default=None)
class Results(models.Model):
quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
created = models.DateField(auto_now_add=True, blank=True, null=True)
score = models.FloatField()
в моих представлениях я хочу получить что-то вроде этого: (Sum of all Results.created dates - Sum of all User.created_at dates)/ len(all users). как я могу этого добиться?
Я использовал агрегат, чтобы написать эту строку кода для тестирования:
Results.objects.filter(user__is_staff=False, user__role='applicant').aggregate(Avg(F('created')))
но это дает мне эту ошибку:
You cannot use Sum, Avg, StdDev, and Variance aggregations on date/time fields in sqlite3 since date/time is saved as text.
Предполагаю, что вы вычисляете среднюю разницу между датой создания учетной записи пользователя и датой завершения каждого из его тестов. Представьте, что у нас есть три результата:
- Пользователь А завершает тест через 3 дня после создания учетной записи.
- Пользователь A завершает второй тест через 4 дня после создания учетной записи.
- Пользователь B завершает тест через 5 дней после создания учетной записи.
Вычисление будет средним из 3, 4 и 5.
Вы можете сделать это с помощью выражений запросов Django.
- Для большей точности измените поле
createdвResultsнаDateTimeFieldвместоDateField. В противном случае ваши расчеты не будут учитывать неполные дни. - Используйте функцию
Fдля ссылки на нужные вам поля:F('created')ссылается на дату созданияResult, аF('user__created_at')ссылается на дату создания счетаResult, соответствующуюUser. Используйте - для создания класса
Func, который представляет функцию JulianDay в SQLite. Эта функция позволяетJulianDayнайти количество дней между двумя датами. Вычислите агрегацию - , используя
Avgв качестве типа данных выходного поля. (Примечание: Вы можете удалить частьFloatField()после того, как измените полеoutput_field=FloatField()вcreatedнаResults.)DateTimeField
# Import your models
from question70860461.models import User, Quiz, Results
# Import Django query expressions
from django.db.models import F, Func, FloatField, Avg
# Set up some example objects
u = User(username='jeffb', first_name='Jeff', last_name='Booth')
u.save()
q = Quiz()
q.save()
r = Results(quiz=q, user=u, score=100)
r.save()
r2 = Results(quiz=q, user=u, score=200)
r2.save()
# The usual trick to find the days between two dates on SQLite
# is to use the JulianDay function. Create a Django Func wrapper
# for this function:
class JulianDay(Func):
function='JulianDay'
# Run a query that finds the average
# time between User creation and Results creation.
x = Results.objects.aggregate(
result=Avg(JulianDay(F('created')) - JulianDay(F('user__created_at')),
output_field=FloatField()))