Django, modelleri tarihe göre nasıl gruplandırabilirim?

oy
9

Diyelim ki benim MyModel bu sahip created_at ve name alanlar. created_at DateTime.

Bu tür değerlere sahip modellerim olduğunu söyleyelim:

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

Bana bu modelleri bu sırayla dönecek sorgu yapmak istiyorum:

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

Tüm modelleri gruplandırmak istiyorum created_at alan, ancak yalnızca Date parçası DateTime alan. Sadece python döngüleri kullanarak bu tür bir sonuç yapabilir biliyorum, ama bu sorunu çözmek için herhangi bir Django ORM yolu var mı?

Oluştur 04/06/2020 saat 13:54
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
0

Aşağıdaki kodu deneyebilirsiniz:

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]

Çıkışı aşağıdaki gibi döndürecektir:

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

Temel olarak, ne yaparsa, önce tüm satırları alır ve daha sonra python düzeyinde bir sözlükte gruplandırır.

Cevap 08/06/2020 saat 15:46
kaynak kullanıcı

oy
0

Korkarım bu şu anda tamamen mümkün değil, en azından bilgim için (Django ORM içinde gerçekten derin değişiklikler olmadan).

Ancak, yapabileceğiniz şey veritabanında tarih dönüşümleri ve toplamalar yapmaktır:

Bu örnekte, veritabanınızın to_char işlevini desteklediği varsayılmaktadır.

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
)

Cevap 08/06/2020 saat 15:50
kaynak kullanıcı

oy
0

Tam olarak anlaşılmıyor, ancak veritabanını models.py altında oluşturduysanız, siparişi gösteren bir meta sınıfı oluşturabilirsiniz.

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

     Class Meta:
         ordering = ('-created_at')

Cevap 04/06/2020 saat 14:22
kaynak kullanıcı

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