Unterschiedliche Django-Objekte nach gemeinsamen Kriterium sortieren

Dieses Blog läuft ja bekanntlich mit einer von mir selbst geschriebenen Django-App. Ich bin sehr zufrieden mit meinem Werk, aber eins hat mich immer gestört: wenn ich ein Update zu einem Posting geschrieben habe UND neue Bilder angehängt habe, wurden diese unzsammenhängend angezeigt (erst das Posting, dann alle Updates, dann alle Bilder). Wirklich doof.

Jetzt werden Bilder und Updates in zeitlicher Reihenfolge angezeigt, hier in Aktion zu bewundern.

Die Schwierigkeit dabei ist, dass es sich bei den Updates und Bildern um völlig verschiedene Objekte handelt, die - abgesehen davon, dass sie mit dem Posting verknüpft sind - nichts miteinander zu tun haben. Trotzdem kann ich beide nach einem gemeinsamen Kriterium, dem Erstellungsdatum, sortieren und in EINER for-Schleife anzeigen. Wie cool ist das denn?!

So guckt das im Django aus:

        def attachments(self):
                snippets = self.snippet_set.all()
                images   = self.image_set.all()
                both     = []
                both.extend(snippets)
                both.extend(images)
                both.sort(key=lambda x: x.date, reverse=False)
                return both

Der Trick dabei ist, sich eine Liste aus beiden Objektlisten zu erzeugen. Das muss man mit einer neuen Liste und extend() machen, weil das mit '+' nämlich nicht geht. Die Methode all() liefert nämlich keine Liste, sondern ein Queryset aus. Durch das both.extend() mache ich also aus 2 Querysets eines. Da beide Objekttypen das Attribute date haben, kann man dann danach sortieren.

Und so der entsprechende Teil im Template:

        {% for item in post.attachments %}
                {% if item.image %}
                        {% with image=item %}
                         ..
                        {% endwith %}
                {% else %}
                        {% with snippet=item %}
                        ..
                {% endif %}
         {% endfor %}

Um welche Art Objekt es sich jeweils handelt frage ich mit dem {% if item.image %} ab. Das geht, weil nur die Images bei mir das Attribut "image" haben und dieses ist immer befüllt (weil mandatory).

Hachmach...


01.02.2013 18:49 CC0 django python software Source

Ähnliche Beiträge:

Null Kommentar zu Unterschiedliche Django-Objekte nach gemeinsamen Kriterium sortieren



Kommentieren:
Aus welchem Land kommen Sie?
Land*:
Ihr Kommentar erscheint erst, wenn wir ihn freigegeben haben!
Mit * markierte Felder sind Pflichtfelder.
Sofern Sie eine Emailadresse eingeben, wird diese automatisch nach einem Monat gelöscht.
Weitere Daten werden nicht aufgezeichnet.