Entonces, básicamente, el título lo dice todo: ¿cómo puedo ordenar el conjunto de consultas que se devolverá en la API mediante un resultado de método invocable que no está almacenado en la base de datos?
Este campo es dinámico y depende de la solicitud de cada usuario, por lo que no se puede almacenar en ningún lado.
Intenté simplemente usar, que es lo que quiero lograr:
queryset = Post.objects.filter('my_filters').order_by('my_method')
pero no funciona ya que tiene que ser una columna en la base de datos.
También probé:
queryset = sorted(Post.objects.filter('my_filters'), key=lambda x: x.my_method())
Pero arroja el error "AttributeError: el objeto 'lista' no tiene atributo 'modelo'".
Entonces, ¿cómo puedo ordenar los resultados del conjunto de consultas de acuerdo con un método? ¿Algunas ideas? También tendré que limitar el número de respuestas a los mejores resultados calculados de esta manera.
¡Gracias!
EDITAR:
'my_filters' en este caso solo verifica una propiedad booleana
.filter(active=True)
y my_method comprueba el tiempo transcurrido comparándolo con timezone.now():
def microseconds_elapsed(self): return getMicrosecondsElapsed(self.datetime)
donde
def getMicrosecondsElapsed(datetime): timedelta = timezone.now() - datetime microseconds = 0 microseconds += timedelta.microseconds microseconds += timedelta.seconds*1000000 microseconds += timedelta.days*86400000000 return microseconds
He progresado un poco usando las funciones de anotación y PostgreSQL usando:
get_queryset().annotate(time_elapsed=Func(F('datetime'), function='age'))
pero esto da como resultado un error de django
El argumento float() debe ser una cadena o un número
En este caso, solo necesito obtener la cantidad de microsegundos transcurridos del campo de fecha y hora almacenado en el objeto para poder continuar con otro cálculo.
¿Alguien sabe qué está pasando y cómo puedo lograr esto?
¡Gracias!