Django, jak grupować modelki według daty?

głosy
42

Powiedzmy, że mam MyModelto created_ati namepola. created_atjest DateTime.

Powiedzmy, że mam modele z takimi wartościami:

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

Chcę zrobić zapytanie, które zwróci mi te modele w tej kolejności:

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

Chcę pogrupować wszystkie modele według created_atpól, ale tylko z wykorzystaniem Dateczęści DateTimepola. Wiem, że mogę osiągnąć taki rezultat tylko poprzez użycie pętli Pythona, ale czy jest jakiś sposób na rozwiązanie tego problemu w Django ORM?

Utwórz 04/06/2020 o 13:54
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
0

Możesz spróbować podążać za kodem:

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]

Zwróci wyjście jak następuje:

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

Zasadniczo, co to robi, najpierw pobiera wszystkie wiersze, a następnie grupuje je na poziomie pytona w słownik.

Odpowiedział 08/06/2020 o 15:46
źródło użytkownik

głosy
0

Obawiam się, że obecnie nie jest to całkowicie możliwe, przynajmniej według mojej wiedzy (bez kilku naprawdę głębokich modyfikacji w Django ORM).

Jednak to, co możesz zrobić, to robić konwersje i agregację danych w bazie danych:

Ten przykład zakłada, że twoja baza danych obsługuje funkcję 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
)

Odpowiedział 08/06/2020 o 15:50
źródło użytkownik

głosy
0

Nie do końca rozumiem, ale jeśli masz bazę danych stworzoną pod adresem models.py to możesz stworzyć meta-klasę, która pokazuje uporządkowanie

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

     Class Meta:
         ordering = ('-created_at')

Odpowiedział 04/06/2020 o 14:22
źródło użytkownik

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