2011-09-14 12 views
7

Soy bastante nuevo en Python y Django y me gustaría seguir las mejores prácticas siempre que sea posible. Me gustaría ordenar el siguiente código para que sea más fácil trabajar con él.Django: una vista, varias URL?

Estoy tratando de configurar una vista a la que se puede acceder a través de varias URL que proporcionan diferentes parámetros para los cuales se devolverá y se mostrará un conjunto de consulta.

haber puesto por las siguientes URL:

url(r'^myrecords/$', login_required(RecordListView.as_view()), {'filter': 'all'}, name='myrecords'), 
    url(r'^myrecords/page(?P<page>[0-9]+)/$', login_required(RecordListView.as_view()), {'filter': 'all'}, name='myrecords'), 
    url(r'^myrecords/(?P<year>\d{4})/$', login_required(RecordListView.as_view()), {'filter': 'year'}, name='myrecords'), 
    url(r'^myrecords/last(?P<months>[0-9]{1,2})months/$', login_required(RecordListView.as_view()), {'filter': 'month'}, name='myrecords'), 

A continuación, en mi opinión, tengo algo como esto (En realidad, hay varios otros parámetros, pero estos deben seguir siendo el mismo, independientemente de la dirección URL especificada.):

def get_queryset(self): 
    if (self.kwargs['filter'] == 'month'): 
     x_months_ago = (datetime.date.today() - 
     datetime.timedelta(int(self.kwargs['months']) * 365/12)) 
     queryset = Record.objects.filter(user=self.request.user, 
     date__gte = x_months_ago.isoformat()) 
    elif (self.kwargs['filter'] == 'year'): 
     queryset = Record.objects.filter(user=self.request.user, date__year=self.kwargs['year']) 
    else 
     queryset = Record.objects.filter(user=self.request.user) 

Esto me parece muy complicado. ¿Hay alguna forma de que pueda hacerlo más limpio? ¿Es posible poner los parámetros de filtro en algún tipo de estructura de datos y luego pasarlos a la línea Record.objects.filter, en lugar de escribir todo el conjunto varias veces?

Cualquier consejo sería muy apreciado.

Gracias.

Respuesta

6

Sure. Puede utilizar un diccionario:

my_queryset_filters = { 
    'user': self.request.user, 
    'date__year': self.kwargs['year'], 
} 

Record.objects.filter(**my_queryset_filters) 

El ** amplía el diccionario en argumentos de palabras clave. (También hay * que expande una lista en argumentos posicionales.)

Cuestiones relacionadas