values_list update sort queryset descending django sql-order-by django-orm

update - Django ordena los artículos por dos campos, pero ignorándolos si son cero



model sort django (2)

Podría usar el método extra () QuerySet para crear un campo adicional en su consulta utilizando la función COALESCE en SQL, que devuelve el primer valor no NULL que se pasa.

Product.objects.extra(select={"current_price":"COALESCE(sale_price, price)"}, order_by=["-current_price"])

Tiene que poner su order_by en la llamada extra () ya que el campo manual adicional "en realidad no existe" en lo que respecta al resto del ORM, pero la sintaxis es la misma que la de Django order_by () s.

Consulte la documentación adicional () aquí: http://docs.djangoproject.com/en/1.3/ref/models/querysets/#extra

Tengo el siguiente modelo (muy simplificado para los propósitos de esta pregunta):

class Product(models.Model): price = models.DecimalField(max_digits=8, decimal_places=2) sale_price = models.DecimalField(max_digits=10, blank=True, null=True, decimal_places=2)

Para la mayoría de los productos, el precio se llenará, pero el precio de venta no se llenará. Entonces, puedo ordenar productos por precio así:

Product.objects.order_by(''price'') Product.objects.order_by(''-price'')

Sin embargo, algunos productos tendrán un precio de venta, y no puedo encontrar una manera de ordenarlos de manera ordenada, de modo que el precio de venta se intercale con el precio normal. Si intento ordenar por ambos campos:

Product.objects.order_by(''sale_price'',''price'')

... entonces todos los productos que no están a la venta aparecen juntos, seguidos de todos los que están, en lugar de intercalar los precios.

¿Esto tiene sentido? ¿Alguien tiene una manera de resolver esto?

¡Gracias!


Si te topas con este requisito y usas Django 1.8 y superior, puedes usar django.db.models.functions.Coalesce para una solución de motor de django.db.models.functions.Coalesce de datos ligeramente más agradable:

from django.db.models.functions import Coalesce Product.objects.annotate( current_price=Coalesce(''sale_price'', ''price'') ).order_by(''-current_price'')