Django, πώς να ομαδοποιήσετε μοντέλα κατά ημερομηνία;

ψήφοι
42

Ας πούμε ότι έχω MyModel που έχει created_at και name πεδία. created_at είναι DateTime.

Ας πούμε ότι έχω μοντέλα με τέτοιου είδους τιμές:

<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 πεδίο. Ξέρω ότι μπορώ να κάνω αυτό το αποτέλεσμα μόνο με τη χρήση βρόχων python, αλλά υπάρχει κάποιος τρόπος 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)>]
}

Βασικά, αυτό που το κάνει πρώτα παίρνει όλες τις σειρές και μετά το ομαδοποιεί σε επίπεδο python σε λεξικό.

Απαντήθηκε 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

Δεν είναι αρκετά κατανοητό, αλλά εάν έχετε δημιουργήσει τη βάση δεδομένων στο models.py, τότε μπορείτε να δημιουργήσετε μια μετα-κλάση που δείχνει την παραγγελία

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