Django, ¿cómo agrupar a los modelos por fecha?

votos
9

Digamos que tengo MyModelque tiene created_aty namecampos. created_ates DateTime.

Digamos que tengo modelos con ese 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>

Quiero hacer una consulta que me devuelva estos modelos en este orden:

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

Quiero agrupar todos los modelos por created_atcampo, pero sólo usando Dateparte del DateTimecampo. Sé que puedo obtener ese tipo de resultado sólo usando bucles de pitón, pero ¿hay alguna forma de Django ORM para resolver este problema?

Publicado el 04/06/2020 a las 13:54
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
0

Puedes intentar seguir el 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]

Devolverá el resultado como el siguiente:

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

Básicamente, lo que hace es que primero busca todas las filas y luego las agrupa a nivel de pitón en un diccionario.

Respondida el 08/06/2020 a las 15:46
fuente por usuario

votos
0

Me temo que actualmente esto no es completamente posible, al menos hasta donde yo sé (sin algunas modificaciones realmente profundas dentro del ORM de Django).

Sin embargo, lo que puede hacer es hacer conversiones de fecha y agregaciones dentro de la base de datos:

Este ejemplo supone que su base de datos soporta la función 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
)

Respondida el 08/06/2020 a las 15:50
fuente por usuario

votos
0

No lo entiendo, pero si tienes la base de datos creada en models.py, puedes crear una meta clase que muestre el orden

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

     Class Meta:
         ordering = ('-created_at')

Respondida el 04/06/2020 a las 14:22
fuente por usuario

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