Django, wie gruppiert man Modelle nach Datum?

stimmen
42

Sagen wir, ich habe MyModeldas hat created_atund nameFelder. created_atist DateTime.

Nehmen wir an, dass ich Modelle mit dieser Art von Werten habe:

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

Ich möchte eine Abfrage machen, die mir diese Modelle in dieser Reihenfolge zurückgibt:

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

Ich möchte alle Modelle nach created_atFeldern gruppieren, aber nur einen Teil der DateTimeFelder verwendenDate. Ich weiß, dass ich diese Art von Ergebnis allein durch die Verwendung von Pythonschleifen erzielen kann, aber gibt es eine Django-ORM-Methode, um dieses Problem zu lösen?

Veröffentlicht am 04/06/2020 um 13:54
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Sie können folgenden Code versuchen:

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]

Die Ausgabe wird wie folgt zurückgegeben:

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

Im Grunde, was es tut, holt es zuerst alle Zeilen und gruppiert sie dann auf Python-Ebene in einem Wörterbuch.

Beantwortet am 08/06/2020 um 15:46
quelle vom benutzer

stimmen
0

Ich fürchte, dies ist derzeit nicht vollständig möglich, zumindest meines Wissens nach (ohne einige wirklich tiefgreifende Änderungen innerhalb des Django ORM).

Was Sie jedoch tun können, ist die Durchführung von Datumskonvertierungen und Aggregationen innerhalb der Datenbank:

In diesem Beispiel wird angenommen, dass Ihre Datenbank die to_char-Funktion unterstützt.

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
)

Beantwortet am 08/06/2020 um 15:50
quelle vom benutzer

stimmen
0

Nicht ganz verständlich, aber wenn Sie die Datenbank unter models.py erstellen lassen, können Sie eine Metaklasse erstellen, die die Reihenfolge anzeigt

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

     Class Meta:
         ordering = ('-created_at')

Beantwortet am 04/06/2020 um 14:22
quelle vom benutzer

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