2011-01-04 4 views
2

Ich habe eine Abfrage setzen 'Elemente' mit Instanzen des Modells Element. Elemente haben einen Fremdschlüssel ‚Serie‘, und hat jede Serie Felder:Liste der Dicts von eindeutigen Werten über mehrere Felder in Django

subtopic_1_name 
subtopic_1_slug 
subtopic_2_name 
subtopic_2_slug 
subtopic_3_name 
subtopic_3_slug 

Ich brauche eine „abgeflachte“ Liste der dicts des Formulars

[{'name': 'somename', 'slug': 'someslug'}, {'name': 'anothername' 'slug': 'anotherslug'}, ... ] 

wo ‚name‘ zu erzeugen und ‚Slug 'entsprechen eindeutigen Werten aus den drei Feldern name und slug, mit Ausnahme der leeren Zeichenfolge. Ich verwende derzeit eine ineffiziente for-Schleife mit "nicht in", um die Eindeutigkeit zu prüfen. Es funktioniert, ist aber zu langsam, weil 'Elemente' bis zu 1,9 Millionen Mitglieder haben können.

Was ist ein effizienter Weg, dies zu tun?

Update:

Hier ist das Beste, was ich bisher habe, aber es muss ein schnellerer Weg sein:

subtopic_list = [] 
ones = elements.values_list('series__subtopic1_name', 'series__subtopic1_slug').distinct() 
twos = elements.values_list('series__subtopic2_name', 'series__subtopic2_slug').distinct() 
threes = elements.values_list('series__subtopic3_name', 'series__subtopic3_slug').distinct() 
for num in [ones, twos, threes]: 
    for name, slug in num: 
     if name != '': 
      subtopic_list.append({'name': name, 'slug': slug)} 

Antwort

0

Was die leeren Namen in der db Abfrage mit ‚ausschließen‘ über Filterung?

ones = elements.exclude('series__subtopic1_name'='').\ 
    values_list('series__subtopic1_name','series__subtopic1_slug').distinct() 

twos = elements.exclude('series__subtopic2_name'='').\ 
    values_list('series__subtopic2_name', 'series__subtopic2_slug').distinct() 

threes = elements.exclude('series__subtopic3_name'='').\ 
    values_list('series__subtopic3_name', 'series__subtopic3_slug').distinct() 

# concatenate element of twos and threes into list 'ones' 
ones.extend(twos) 
ones.extend(threes) 

# we already filtered empty names in the db query, 
# so we can just return the subtopic_list 
subtopic_list = [{'name': name, 'slug': slug} for name, slug in ones] 
+0

Danke. Ich habe auf einen Weg gehofft, um die Notwendigkeit für die drei verschiedenen() Aufrufe zu vermeiden, aber das ist sauberer Code. – thebenedict

+0

Warum möchten Sie die verschiedenen() Aufrufe loswerden? Es ist möglich, aber in Ihrer Frage erwähnten Sie, dass Sie die teure For-Schleife eliminieren wollten. – Tommy

Verwandte Themen