Django, hogyan lehet csoportosítani modelleket dátum szerint?

szavazat
42

Mondhatjuk, hogy van MyModel annak van created_at és name területeken. created_at a DateTime.

Tegyük fel, hogy vannak olyan modellek, amelyek ilyen értékekkel rendelkeznek:

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

Szeretnék olyan kérdést tenni, amely a következő sorrendben adja vissza nekem ezeket a modelleket:

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

Szeretnék összes modellt csoportosítani created_at mezőt, de csak a Date része DateTime terület. Tudom, hogy csak python hurok segítségével tudok ilyen eredményt elérni, de van-e Django ORM módszer a probléma megoldására?

A kérdést 04/06/2020 13:54
a forrás felhasználó
Más nyelveken...                            


3 válasz

szavazat
0

Kipróbálhatja a következő kódot:

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]

A kimenetet a következőképpen adja vissza:

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

Alapvetően, amit csinál, először lehívja az összes sort, majd python szinten szétosztja egy szótárba.

Válaszolt 08/06/2020 15:46
a forrás felhasználó

szavazat
0

Attól tartok, ez jelenleg nem teljesen lehetséges, legalábbis tudomásom szerint (a Django ORM-en belül valóban mély változások nélkül).

Amit dátumkonverzióval és aggregálással hajthat végre az adatbázisban:

Ez a példa feltételezi, hogy az adatbázis támogatja a to_char funkciót.

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
)

Válaszolt 08/06/2020 15:50
a forrás felhasználó

szavazat
0

Nem egészen értem, de ha az adatbázis létrehozva van a models.py alatt, akkor létrehozhat egy meta osztályt, amely megmutatja a megrendelést

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

     Class Meta:
         ordering = ('-created_at')

Válaszolt 04/06/2020 14:22
a forrás felhasználó

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