Django, hvordan gruppere modeller etter dato?

stemmer
9

La oss si at det har jeg MyModel det har created_at og name Enger. created_at er DateTime.

La oss si at jeg har modeller med den typen verdier:

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

Jeg vil lage spørsmål som vil returnere disse modellene til meg i denne rekkefølgen:

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

Jeg vil gruppere alle modeller etter created_at felt, men bare bruker Date del av DateTime felt. Jeg vet at jeg kan gjøre den typen resultat bare ved å bruke python-løkker, men er det noen Django ORM-måte å løse dette problemet på?

Publisert på 04/06/2020 klokken 13:54
kilden bruker
På andre språk...                            


3 svar

stemmer
0

Du kan prøve å følge koden:

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]

Det vil returnere utdata som følgende:

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

I utgangspunktet henter det alle radene, og gjør det først på pytonnivå i en ordbok.

Svarte 08/06/2020 kl. 15:46
kilden bruker

stemmer
0

Jeg er redd for at dette foreløpig ikke er fullt mulig, i det minste etter min kunnskap (uten noen virkelig dype modifikasjoner innen Django ORM).

Det du imidlertid kan gjøre er å gjøre datakonverteringer og aggregeringer i databasen:

Dette eksemplet antar at databasen din støtter to_char-funksjonen.

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
)

Svarte 08/06/2020 kl. 15:50
kilden bruker

stemmer
0

Ikke helt forstående, men hvis du har databasen opprettet under models.py, kan du lage en metaklasse som viser bestilling

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

     Class Meta:
         ordering = ('-created_at')

Svarte 04/06/2020 kl. 14:22
kilden bruker

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