Математические операции над аннотациями Джанго - PullRequest
3 голосов
/ 01 июля 2010

У меня есть модель Django, которая определяет временной интервал.Каждый интервал времени может содержать определенное количество пользователей (TimeSlot.spots).Каждый временной интервал также содержит определенное количество пользователей, уже находящихся в нем (поле «многие ко многим», TimeSlot.participants.

Когда я перехожу к шаблону, который отображает доступные временные интервалы для пользователя, я отмечаю TimeSlot.objects.annotate(Count('participants')), который дает количество пользователей, которые в настоящее время удерживаются в TimeSlot, как participants__count.

Однако, что мне действительно нужно, так это количество оставшихся мест, емкость (TimeSlot.spots) минус количество в настоящее время удерживаемых (participants__count). Как мне пометить другое поле этим новым номером, чтобы я мог передать его в шаблон?

Ответы [ 2 ]

2 голосов
/ 28 октября 2014

Это все еще невозможно с аннотацией (хотя это планируется реализовать в Django).Но вы можете сделать это с помощью запроса .extra().Подробности см. В моем ответе на другой вопрос.

Upd.:

По сути, вам нужно что-то вроде этого запроса:

items = MyModel.objects.extra(
    select = {'variance': 'Model.someField - SUM(relatedModel__someField)'},
)
1 голос
/ 01 июля 2010

Невозможно только с аннотацией. Я бы создал метод на модели, который делает аннотации, а затем вычел бы это из вашего значения TimeSlot.spots. Это будет использовать больше запросов к базе данных, но это ваш единственный вариант. Или, я думаю, вы могли бы перейти на сырой SQL ...

...