Django, cum să grupezi modele după dată?

voturi
9

Să spunem că am MyModel care are created_at și name câmpuri. created_at este DateTime.

Să spunem că am modele cu acel tip de 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>

Vreau să fac o întrebare care să revină la mine aceste modele în această 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>]
]

Vreau să grup toate modelele după created_at câmp, dar numai folosind Date o parte din DateTime camp. Știu că pot obține astfel de rezultate doar folosind bucle python, dar există vreun mod Django ORM de a rezolva această problemă?

Întrebat 04/06/2020 la 13:54
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
0

Puteți încerca următorul cod:

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]

Va reveni la ieșire, după cum urmează:

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

Practic, ceea ce face, mai întâi adună toate rândurile și apoi grupează-l la nivel de piton într-un dicționar.

Publicat 08/06/2020 la 15:46
sursa de către utilizator

voturi
0

Mă tem că acest moment nu este complet posibil, cel puțin din cunoștința mea (fără unele modificări cu adevărat profunde în cadrul ORD Django).

Totuși, puteți face conversii de date și agregări în baza de date:

Acest exemplu presupune că baza de date acceptă funcția 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
)

Publicat 08/06/2020 la 15:50
sursa de către utilizator

voturi
0

Nu este destul de înțelegător, dar dacă aveți baza de date creată sub models.py, atunci puteți crea o clasă meta care arată comanda

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

     Class Meta:
         ordering = ('-created_at')

Publicat 04/06/2020 la 14:22
sursa de către utilizator

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