Seite 1 von 1
[Django]ValuesQuerySet: Zugriff auf erstes Dictionary
Verfasst: Samstag 27. Juni 2009, 13:57
von ferix
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.
Verfasst: Samstag 27. Juni 2009, 14:57
von ferix
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???
Verfasst: Samstag 27. Juni 2009, 16:33
von apollo13
Warum nicht die queryset limit Funktion verwenden, wenn du eh nur eines willst?
Verfasst: Samstag 27. Juni 2009, 16:39
von ferix
Weil ich genau nach so ner Variante gesucht habe und diese nicht gefunden

Vielen Dank! Mal schauen, dass ich das so mache.
Verfasst: Samstag 27. Juni 2009, 17:48
von ferix
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?
Verfasst: Sonntag 28. Juni 2009, 11:01
von apollo13
ferix hat geschrieben:
Code: Alles auswählen
for image in images:
item['thumb']=image['image_thumb']
Nimm das:
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)
Verfasst: Sonntag 28. Juni 2009, 17:07
von sma
Warum nicht einfach `Image.objects....[0]`?
Stefan
Verfasst: Montag 29. Juni 2009, 09:33
von ferix
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.
Verfasst: Mittwoch 1. Juli 2009, 09:07
von sma
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