Django, como agrupar modelos por data?

votos
9

Vamos dizer que eu tenho MyModelisso created_ate os namecampos. created_até DateTime.

Vamos dizer que eu tenho modelos com esse tipo de valores:

<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>

Quero fazer uma consulta que me devolva estes modelos nesta ordem:

[
    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>]
]

Eu quero agrupar todos os modelos por created_atcampo, mas usando Dateapenas parte do DateTimecampo. Eu sei que posso fazer esse tipo de resultado apenas usando loops python, mas existe alguma forma de Django ORM para resolver esse problema?

Publicado 04/06/2020 em 13:54
fonte usuário
Em outras línguas...                            


3 respostas

votos
0

Você pode tentar seguir o código:

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]

Ele retornará a saída como se segue:

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

Basicamente, o que ele faz, primeiro vai buscar todas as linhas e depois agrupá-lo em nível de pitão em um dicionário.

Respondeu 08/06/2020 em 15:46
fonte usuário

votos
0

Receio que isto não seja actualmente completamente possível, pelo menos que eu saiba (sem algumas modificações realmente profundas dentro do Django ORM).

O que você pode fazer, no entanto, é fazer conversões e agregações de datas dentro da base de dados:

Este exemplo assume que sua base de dados suporta a função 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
)

Respondeu 08/06/2020 em 15:50
fonte usuário

votos
0

Não entendo bem, mas se você tiver o banco de dados criado em model.py então você pode criar uma metaclasse que mostra a ordenação

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

     Class Meta:
         ordering = ('-created_at')

Respondeu 04/06/2020 em 14:22
fonte usuário

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