Django, तिथि से समूह मॉडल कैसे करें?

वोट
9

कहते हैं कि मेरे पास है MyModel जिसके पास है created_at तथा name खेत। created_at डेटाइम है।

आइए हम कहते हैं कि मेरे पास उस तरह के मूल्य वाले मॉडल हैं:

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

मैं इस क्रम में इन मॉडलों को लौटाना चाहता हूं:

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

मैं सभी मॉडलों को समूहीकृत करना चाहता हूं created_at फ़ील्ड, लेकिन केवल उपयोग करके Date का हिस्सा DateTime खेत। मुझे पता है कि मैं केवल अजगर छोरों का उपयोग करके उस तरह का परिणाम बना सकता हूं, लेकिन क्या इस समस्या को हल करने के लिए कोई Django ORM तरीका है?

04/06/2020 को 13:54
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
0

आप निम्नलिखित कोड आज़मा सकते हैं:

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]

यह निम्न की तरह आउटपुट लौटाएगा:

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

असल में, यह क्या करता है यह पहले सभी पंक्तियों को प्राप्त करता है और फिर इसे अजगर स्तर पर एक शब्दकोश में समूहित करता है।

08/06/2020 को 15:46
का स्रोत उपयोगकर्ता

वोट
0

मुझे डर है कि यह वर्तमान में पूरी तरह से संभव नहीं है, कम से कम मेरे ज्ञान (Django ORM के भीतर कुछ वास्तव में गहरे संशोधनों के बिना) के साथ।

हालाँकि, आप क्या कर सकते हैं, डेटाबेस में तारीख रूपांतरण और एकत्रीकरण कर रहा है:

यह उदाहरण मानता है कि आपका डेटाबेस 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
)

08/06/2020 को 15:50
का स्रोत उपयोगकर्ता

वोट
0

काफी समझ में नहीं आता है, लेकिन अगर आपके पास मॉडल के तहत डेटाबेस बनाया गया है तो आप एक मेटा क्लास बना सकते हैं जो ऑर्डर दिखाता है

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

     Class Meta:
         ordering = ('-created_at')

04/06/2020 को 14:22
का स्रोत उपयोगकर्ता

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