Как сформулировать этот сложный запрос к базе данных с помощью Django 3.0? - PullRequest
0 голосов
/ 20 июня 2020

У меня есть следующая таблица:

enter image description here

Now I want to group the data by code, have a sum of visitors and the number of total nights the visitors stayed for each.

I can do the first bit with this query:

result = Entry.objects.filter(owner=request.user).values("code").annotate(
            total_visitors=Sum("visitors"))

Это дает что-то вроде этих строк: [{'code': 'AT - Wien', 'visitors': 2}, {'code': 'CN - China', 'visitors': 4}, ...]

Мне нужно что-то вот так: [{'code': 'AT - Wien', 'visitors': 2, 'nights': x}, {'code': 'CN - China', 'visitors': 4, 'nights': x}, ...]

Теперь проблема в том, сколько всего ночей они провели. Для каждой записи мне нужно будет сделать следующее, чтобы вычислить это: nights = (departure - arrival) * visitors

Как мне сделать это правильно? Я могу сделать это в коде и перебирать отдельные записи, но должен быть более чистый способ.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Можно использовать Django ORM:

Предполагая, что вылет и прибытие хранятся как тип данных даты. Вот что вам следует сделать:

from django.db.models import Sum, F
result = Entry.objects.filter(owner=request.user).values("code").annotate(
            total_visitors=Sum("visitors"), 
            nights=Sum(F("Departure") - F("Arrival")))

And ::

Чтобы запустить запрос (Отъезд - Прибытие) * посетителей, нам нужно создать нашу собственную функцию, например:

from django.db.models import Sum, F, Func
class DayDiff(Func):
    function = 'datediff'
    output_field = IntegerField()

Entry.objects.filter(owner=request.user).values("code").annotate(
                total_visitors=Sum("visitors"), 
                nights=Sum(DayDiff('Departure', 'Arrival')*F('visitors')))

Надеюсь, это поможет !!

0 голосов
/ 20 июня 2020

Посмотрите здесь:

У вас должна быть возможность создавать свои собственные.

https://docs.djangoproject.com/en/3.1/ref/models/expressions/#func -выражения

...