Django, come raggruppare i modelli per data?

voti
9

Diciamo che ho MyModelche ha created_ate namecampi. created_atè DateTime.

Diciamo che ho modelli con questo tipo di valori:

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

Voglio fare una query che mi restituirà questi modelli in questo ordine:

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

Voglio raggruppare tutti i modelli per created_atcampo, ma utilizzando Datesolo una parte del DateTimecampo. So che posso ottenere questo tipo di risultato solo usando loop di pitone, ma c'è un modo Django ORM per risolvere questo problema?

È pubblicato 04/06/2020 alle 13:54
fonte dall'utente
In altre lingue...                            


3 risposte

voti
0

Si può provare a seguire il codice:

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]

Restituirà l'uscita come segue:

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

Fondamentalmente, quello che fa, prima recupera tutte le righe e poi le raggruppa a livello di pitone in un dizionario.

Risposto il 08/06/2020 a 15:46
fonte dall'utente

voti
0

Temo che al momento questo non sia completamente possibile, almeno a mia conoscenza (senza alcune modifiche davvero profonde all'interno dell'ORM Django).

Quello che si può fare, tuttavia, è fare conversioni e aggregazioni di date all'interno del database:

Questo esempio presuppone che il vostro database supporti la funzione 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
)

Risposto il 08/06/2020 a 15:50
fonte dall'utente

voti
0

Non è molto comprensibile, ma se si ha il database creato sotto model.py allora si può creare una meta-classe che mostra l'ordinamento

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

     Class Meta:
         ordering = ('-created_at')

Risposto il 04/06/2020 a 14:22
fonte dall'utente

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