patternpythondjangoMinor
Building SQL query
Viewed 0 times
sqlquerybuilding
Problem
I wrote a messy function and I am wondering if you see any way I could clean it up. Essentially it takes in a list
It's called like this:
e_1=2&e_2=23&e_3=1 and makes a queryset out of it, maintaining the ordering.from operator import itemgetter
def ids_to_students(items, prefix=0):
if prefix == 0:
# Make ordered QuerySets of Students based on there ids
etuples = sorted([(k,v) for k,v in items if k[:2] == 'e_'], key=itemgetter(0))
ituples = sorted([(k,v) for k,v in items if k[:2] == 'i_'], key=itemgetter(0))
tuples = etuples+ituples
else:
tuples = sorted([(k,v) for k,v in items if k[:2] == '%s_'%prefix], key=itemgetter(0))
pk_list = [v for (k,v) in tuples]
clauses = ' '.join(['WHEN id=%s THEN %s' % (pk, i) for i, pk in enumerate(pk_list)])
ordering = 'CASE %s END' % clauses
students = Student.objects.filter(pk__in=pk_list).extra(
select={'ordering': ordering}, order_by=('ordering',))
return studentsIt's called like this:
students = ids_to_students(request.GET.items())
e_students = ids_to_students(request.GET.items(), 'e')Solution
Tuples are sorted primarily by the first item of each. If they are all unique, specifying
This code
can be rearranged like this to avoid repetition:
key=itemgetter(0) makes no difference. This code
if prefix == 0:
etuples = sorted([(k,v) for k,v in items if k[:2] == 'e_'], key=itemgetter(0))
ituples = sorted([(k,v) for k,v in items if k[:2] == 'i_'], key=itemgetter(0))
tuples = etuples+ituples
else:
tuples = sorted([(k,v) for k,v in items if k[:2] == '%s_'%prefix], key=itemgetter(0))can be rearranged like this to avoid repetition:
prefixes = ['%s_'%prefix] if prefix else ['e_', 'i_']
tuples = sorted(item for item in items if item[0][:2] in prefixes)Code Snippets
if prefix == 0:
etuples = sorted([(k,v) for k,v in items if k[:2] == 'e_'], key=itemgetter(0))
ituples = sorted([(k,v) for k,v in items if k[:2] == 'i_'], key=itemgetter(0))
tuples = etuples+ituples
else:
tuples = sorted([(k,v) for k,v in items if k[:2] == '%s_'%prefix], key=itemgetter(0))prefixes = ['%s_'%prefix] if prefix else ['e_', 'i_']
tuples = sorted(item for item in items if item[0][:2] in prefixes)Context
StackExchange Code Review Q#45023, answer score: 6
Revisions (0)
No revisions yet.