Django, jak seskupovat modely podle data?

hlasů
3

Řekněme, že ano MyModel to má created_at a name pole. created_at je DateTime.

Řekněme, že mám modely s takovými hodnotami:

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

Chci vytvořit dotaz, který mi vrací tyto modely v tomto pořadí:

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

Chci seskupit všechny modely podle created_at pole, ale pouze pomocí Date část DateTime pole. Vím, že mohu dosáhnout takového výsledku pouhým použitím pythonových smyček, ale existuje nějaký Django ORM způsob, jak tento problém vyřešit?

Položena 04/06/2020 v 13:54
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
0

Můžete zkusit následující kód:

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]

Vrátí výstup takto:

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

V zásadě, co to dělá, nejprve načte všechny řádky a poté je seskupí na úrovni pythonu do slovníku.

Odpovězeno 08/06/2020 v 15:46
zdroj uživatelem

hlasů
0

Obávám se, že to v současné době není úplně možné, alespoň podle mých znalostí (bez nějakých opravdu hlubokých úprav v rámci Django ORM).

Co však můžete udělat, je to, že v databázi provádíte převody a agregace dat:

Tento příklad předpokládá, že vaše databáze podporuje funkci 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
)

Odpovězeno 08/06/2020 v 15:50
zdroj uživatelem

hlasů
0

Ne úplně pochopení, ale pokud máte databázi vytvořenou pod models.py, můžete vytvořit meta třídu, která ukazuje řazení

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

     Class Meta:
         ordering = ('-created_at')

Odpovězeno 04/06/2020 v 14:22
zdroj uživatelem

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