2010-03-13 2 views
3

Я ищу что-то вроде следующего:Django: Группа?

previous_invoices = Invoice.objects.filter(is_open=False) 
            .order_by('-created') 
            .group_by('user') 

но group_by() не существует ...

Это найдет последний завершенный счет-фактуру для каждого пользователя.

Это aggregation API, похоже, позволяет делать такие вещи для подсчета и сумм, но мне не нужны счет или сумма или что-то еще, я действительно хочу объекты счета!

+0

- это * выбранный * вещь, определенная при использовании группы? Я ожидаю, что он даст разные результаты в зависимости от реализации sql ... – user3012759

+0

@ user3012759 № Порядок выполняется после группировки, запись, которую вы возвращаете в пределах этой группы, не определена. Мне потребовалось некоторое время, чтобы это понять. ['ONLY_FULL_GROUP_BY'] (https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by) должен быть включен по умолчанию IMO, чтобы вы не допустили ошибку. – mpen

+0

Эй @mpen Я добавил новую попытку ответить. Позаботьтесь, чтобы взглянуть? –

ответ

1

Вариант 1:

Хотя group_by() не существует в Django, вы можете попробовать и работать вокруг на получение последнего завершенного счет-фактуру для каждого пользователя, используя latest() метод и фильтр для пользователя, а также:

previous_invoices = Invoice.objects.filter(user=my_user, is_open=False) 
            .latest('created') 

Для более старых версий Django были latest() не существует, то запрос будет выглядеть следующим образом:

previous_invoices = Invoice.objects.filter(user=my_user, is_open=False) 
            .order_by('-created')[0] 

Вариант 2:

Если вы абсолютно хотите создать эффекты group_by, то для Вас создать одну вручную, как показано в общепринятом ответ здесь: Django GROUP BY field value.

  1. Использование .values_list() с flat=True, чтобы получить список существующих значений в базе данных (если вы заранее не знаете их).Кроме того, использование .distinct() для elimintae повторяющихся значений, как мы не заботиться о тех, кто:

    value_list = MyModel.objects.values_list(
        'interesting_field', flat=True 
    ).distinct() 
    
  2. Теперь перебирать value_list и заполнить свой словарь:

    group_by_value = {} 
    for value in value_list: 
        group_by_value[value] = MyModel.objects.filter(interesting_field=value) 
    

Теперь group_by_value словаря содержит в качестве ключей отчетливых значения в вашем interesting_field и как значения объекты запроса, каждый , содержащий записи MyModel с interesting_field=a value from value_list.


Примечание:

Там существует эта библиотека django-group-by, которая претендует добавить group_by() на Django вы можете проверить.

2

Там в this page from 2007 кто взломал его Джанго, но это было бы спорным, поскольку заранее 1.1 действительно есть недокументированная group_by` в любом случае. Но this thread from a year ago, похоже, имеет некоторые идеи. По существу:

Django намеренно не раскрывает «GROUP BY» или что-то в этом роде, в ORM. Хотя тот факт, что мы имеем по бэкенду реляционного хранилища , иногда протекает, ORM API является довольно агрегированным SQL-агностиком. Вместо этого мы подвергать отдельные куски функциональности, которые случаются быть реализовано с использованием «GROUP BY», когда он превратился в SQL (и вполне может быть реализован некоторыми совершенно другим набора волшебных фей с серверной системой разных хранений).

Смотрите также упоминания использования extra, а также магические способы, в которых что может потерпеть неудачу. Удачи.

Смежные вопросы