[Django]ValuesQuerySet: Zugriff auf erstes Dictionary

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Das Django ValuesQuerySet ist ja eine Liste von Dicts. Weiß jemand wie ich hier auf das erste Dict dieses ValuesQuerySet zugreifen kann??
Normale Listenanwendeungen funktionieren irgendwie nicht.

Code: Alles auswählen

images = Image.objects.filter(property__object_id=item['object_id']).values('image_thumb')
Obige Abfrage führe ich durch und ich möchte dann aber nur das erste Dict aus der Liste haben.
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Habe es jetzt so gelöst, was wohl eher unschön ist:

Code: Alles auswählen

    @staticmethod
    def get_properties(url):
        """
        Hole Informationen der gewünschten Kategorie
        """
        # Hole die benötigten Werte der Objekte, die aktiviert oder verkauft
        properties = Property.objects.filter(category__url=url).exclude(hp_status='D').values('object_id', 'title', 'hp_status', 'city', 'living_area', 'price', 'rooms')
        
        # Hole die benötigten Werte der Bilder zu den jeweiligen Objekten
        for item in properties:
            images = Image.objects.filter(property__object_id=item['object_id']).values('image_thumb')
            i=0
            for image in images:
                if i==0:
                    item['thumb']=image['image_thumb']
                i=i+1
        
        # Verschönere Darstellung Preis
        locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
        for item in properties:
            item['price'] = locale.format('%0.2f', item['price'], True) 
            
        return properties

Ohnehin sind diese ValuesQuerySet nicht mein Ding, aber in Django 1.0.2 komme ich einfach nicht drum herum. Ich möchte nun mal auch die Möglichkeit haben einzelne Daten aus einer Datenbank zu holen, um nicht Unmengen überflüssiges Zeug aus der DB zu holen. In Django 1.1 wirds dann zum Glück defer geben, was eine Model-Instance zurückgibt und womit es sich sicher leichter arbeiten lässt.

Hat sonst jemand noch eine Idee, wie ich einfacher an den ersten Datensatz der zu der Property zugehörigen Bilder komme?

Mal eine andere Frage btw.:
Wie verteile ich solch ein langes Django-DB-Query am Besten auf mehrere Zeilen???
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Warum nicht die queryset limit Funktion verwenden, wenn du eh nur eines willst?
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Weil ich genau nach so ner Variante gesucht habe und diese nicht gefunden ;)
Vielen Dank! Mal schauen, dass ich das so mache.
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Hallo,

jetzt sieht es zumindest mal kürzer aus durch das LIMIT.

Code: Alles auswählen

        # Hole die benötigten Werte der Objekte, die aktiviert oder verkauft
        properties = Property.objects.filter(category__url=url).exclude(hp_status='D').values('object_id', 'title', 'hp_status', 'city', 'living_area', 'price', 'rooms')
        
        # Hole die benötigten Werte der Bilder zu den jeweiligen Objekten
        for item in properties:
            images = Image.objects.filter(property__object_id=item['object_id']).values('image_thumb')[:1]
            for image in images:
                item['thumb']=image['image_thumb']
Aber um das

Code: Alles auswählen

            for image in images:
                item['thumb']=image['image_thumb']
Komm ich wohl nicht rum? Bekomme ja trotz des LIMIT ein ValuesQuerySet zurück halt bloß mit nur einem Element enthalten.

Und noch mal die Frage:
Wie kann man solche längeren DB-Querys über mehrere Zeilen gut verteilen?
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

ferix hat geschrieben:

Code: Alles auswählen

            for image in images:
                item['thumb']=image['image_thumb']
Nimm das:

Code: Alles auswählen

item['thumb'] = list(images)[0]['image_thumb'
Und noch mal die Frage:
Wie kann man solche längeren DB-Querys über mehrere Zeilen gut verteilen?
Du kannst nach einem "(" umbrechen. Und versuch mal Model.objects.filter().\
.nächster_filter()... Das sollte auch gehen (nicht getestet)
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Warum nicht einfach `Image.objects....[0]`?

Stefan
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Weil das so wie ich das festgestellt habe nicht ging.
Dieses ValuesQueryset muss wie in dem Ansatz von apollo13 erst in eine "echte" Liste umgewandelt werden.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Komisch. Bei mir geht's:

Code: Alles auswählen

>>> Entry.objects.all()
[<Entry: Mein erster Beitrag>, <Entry: Zweiter Beitrag>]
>>> Entry.objects.all()[0]
<Entry: Mein erster Beitrag>
>>> Entry.objects.values('title')
[{'title': u'Mein erster Beitrag'}, {'title': u'Zweiter Beitrag'}]
>>> Entry.objects.values('title')[0]
{'title': u'Mein erster Beitrag'}
Stefan
Antworten