Джанго, как группировать моделей по дате?

голоса
42

Скажем, что у меня есть, MyModelчто есть created_atи nameполя. created_atЭто DateTime.

Скажем так, у меня есть модели с такими значениями:

<id: 1, name: A, created_at: 04.06.2020T17:49>
<id: 2, name: B, created_at: 04.06.2020T18:49>
<id: 3, name: C, created_at: 05.06.2020T20:00>
<id: 4, name: D, created_at: 06.06.2020T19:20>
<id: 5, name: E, created_at: 06.06.2020T13:29>
<id: 6, name: F, created_at: 06.06.2020T12:55>

Я хочу сделать запрос, который вернет мне эти модели в таком порядке:

[
    04.06.2020: [<id: 1, name: A, created_at: 04.06.2020T17:49>, <id: 2, name: B, created_at: 04.06.2020T18:49>],
    05.06.2020: [<id: 3, name: C, created_at: 05.06.2020T20:00>]
    06.06.2020: [<id: 4, name: D, created_at: 06.06.2020T19:20>, <id: 5, name: E, created_at: 06.06.2020T13:29>, <id: 6, name: F, created_at: 06.06.2020T12:55>]
]

Я хочу сгруппировать все модели по created_atполям, но только по Dateчасти DateTimeполей. Я знаю, что могу получить такой результат, просто используя питоновые циклы, но есть ли Django ORM способ решить эту проблему?

Задан 04/06/2020 в 13:54
источник пользователем
На других языках...                            


3 ответов

голоса
0

Вы можете попробовать следующий код:

samples = MyModel.objects.all()
result = {}
for sample in samples:
    date_string = sample.created_at.strftime("%m.%d.%Y")
    if date_string in result:
        result[date_string].append(sample)
    else:
        result[date_string] = [sample]

Он вернет вывод следующим образом:

{
'06.07.2020': [<Sample: MyModel object (1)>],
'05.07.2020': [<Sample: MyModel object (2)>, <Sample: MyModel object (3)>]
}

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

Ответил 08/06/2020 в 15:46
источник пользователем

голоса
0

Боюсь, что в настоящее время это не совсем возможно, по крайней мере, насколько мне известно (без некоторых действительно глубоких модификаций в Django ORM).

Однако вы можете выполнять преобразование даты и агрегирование в базе данных:

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

qs = MyModel.objects.all()
qs.annotate(
  created_at_date=models.Func(
    models.F('created_at'),
    models.Value("'dd.MM.yyyy'"),
    function='to_char',
  )
).values('started_at_date').aggregate(
    # do required aggregations like Count or Sum
)

Ответил 08/06/2020 в 15:50
источник пользователем

голоса
0

Не совсем понимаю, но если у вас есть база данных, созданная в рамках models.py, то вы можете создать мета-класс, который покажет упорядоченность

Class myModel(models.Model):
    #fields...

     Class Meta:
         ordering = ('-created_at')

Ответил 04/06/2020 в 14:22
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more