Как получить среднее значение двух полей даты

Я хочу вычесть время создания объекта результата пользователя и время регистрации пользователя. вот мои модели:

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.

Предполагаю, что вы вычисляете среднюю разницу между датой создания учетной записи пользователя и датой завершения каждого из его тестов. Представьте, что у нас есть три результата:

  1. Пользователь А завершает тест через 3 дня после создания учетной записи.
  2. Пользователь A завершает второй тест через 4 дня после создания учетной записи.
  3. Пользователь B завершает тест через 5 дней после создания учетной записи.

Вычисление будет средним из 3, 4 и 5.

Вы можете сделать это с помощью выражений запросов Django.

  1. Для большей точности измените поле created в Results на DateTimeField вместо DateField. В противном случае ваши расчеты не будут учитывать неполные дни.
  2. Используйте функцию F для ссылки на нужные вам поля: F('created') ссылается на дату создания Result, а F('user__created_at') ссылается на дату создания счета Result, соответствующую User.
  3. Используйте
  4. для создания класса Func, который представляет функцию JulianDay в SQLite. Эта функция позволяет JulianDay найти количество дней между двумя датами.
  5. Вычислите агрегацию
  6. , используя Avg в качестве типа данных выходного поля. (Примечание: Вы можете удалить часть FloatField() после того, как измените поле output_field=FloatField() в created на Results.)DateTimeField
  7. # 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()))
    
Вернуться на верх