Агрегация с django-eztables

Я использую django-eztables для обработки данных на стороне сервера. До сих пор все работало нормально, но сейчас я пытаюсь добавить в свою таблицу поле, содержащее общее количество объектов, связанных с объектом через определенный внешний ключ. Достаточно просто настроить отображение на стороне клиента с помощью fnRender, но поскольку сортировка выполняется на стороне сервера, мне нужно выполнить агрегирование на стороне сервера. Это оказалось трудным.

Я не могу найти способ справиться с этим на стороне сервера. Записи в объекте fields, кажется, только принимают фактические поля модели, и я не вижу способа проскользнуть в аннотации, предложенной моими выводами Google. Я рассмотрел определение пользовательской сортировки, но поскольку я просто строю строку, это, похоже, не очень помогает.

В идеале я хотел бы найти способ использовать агрегацию отношения внешнего ключа прямо в словаре полей, что-то вроде:

fields = {
    'id': 'id',
    'name': 'name',
    'total_items': 'items__count' #Something like this, where Item has a foreign key to the object the datatable is composed of
    #More fields...
}

Если это невозможно или неосуществимо, просто сделать так, чтобы сортировка основывалась на агрегации, хорошо, так как я могу изменить данные, отображаемые в таблице, со стороны клиента, и мне не нужно выполнять какую-либо фильтрацию.

1 ответ

Решение

В конце концов я понял, что могу добавить аннотацию, когда переопределяю get_queryset, вот так:

def get_queryset(self):
    qs = super(SomeObjectDataTableView, self).get_queryset()
    return qs.select_related().annotate(items_count=Count('items'))

Вероятно, должен был понять это раньше...

Другие вопросы по тегам