Django, hoe groeperen we modellen op datum?

stemmen
3

Laten we zeggen dat ik MyModeldat heb created_aten namevelden. created_atis DateTime.

Laten we zeggen dat ik modellen heb met dat soort waarden:

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

Ik wil een query maken die me deze modellen in deze volgorde zal teruggeven:

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

Ik wil alle modellen groeperen per created_atveld, maar slechts een deel van het DateTimeveld gebruikenDate. Ik weet dat ik dat soort resultaten kan maken door alleen maar pythonlussen te gebruiken, maar zijn er Django ORM manieren om dit probleem op te lossen?

De vraag is gesteld op 04/06/2020 om 13:54
bron van user
In andere talen...                            


3 antwoorden

stemmen
0

U kunt proberen de code te volgen:

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]

Het zal de output als volgt teruggeven:

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

In principe, wat het doet het haalt eerst alle rijen op en groepeert het dan op pythonniveau in een woordenboek.

antwoordde op 08/06/2020 om 15:46
bron van user

stemmen
0

Ik ben bang dat dit op dit moment niet volledig mogelijk is, althans voor zover ik weet (zonder enkele zeer diepgaande wijzigingen binnen de Django ORM).

Wat u wel kunt doen is datumconversies en aggregaties doen binnen de database:

Dit voorbeeld gaat ervan uit dat uw database de to_char-functie ondersteunt.

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
)

antwoordde op 08/06/2020 om 15:50
bron van user

stemmen
0

Niet helemaal begrijpen, maar als je de database hebt gemaakt onder models.py dan kun je een metaklasse maken die de volgorde laat zien

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

     Class Meta:
         ordering = ('-created_at')

antwoordde op 04/06/2020 om 14:22
bron van user

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