Tengo los dos siguientes modelos:

class DeliveryTime(models.Model):
   delivery_time = models.CharField(max_length=15)

class BlockedDeliveryTime(models.Model):
   delivery_date = models.DateField()
   delivery_time = models.ForeignKey(DeliveryTime) 

Quiero volver todos los plazos de entrega de un día, es decir, todos los DeliveryTime excluyendo el BlockedDeliveryTime.

 blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date)
 delivery_times = DeliveryTime.objects.all()

De delivery_times queryset quiero quitar todos los blocked_delivery_times.delivery_time

¿Cómo puedo hacer eso? Alguna sugerencia?

InformationsquelleAutor reevh | 2014-03-08

3 Comentarios

  1. 41
    blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date) \
        .values('delivery‌​_time')
    delivery_times = DeliveryTime.objects.exclude(id__in=blocked_delivery_times)
    • esto es exactamente lo que yo estaba buscando, pero la exclusión no está funcionando delivery_times = DeliveryTime.objects.exclude(delivery_time__in=t) es devolver todos los DeliveryTime
    • sí, lo hice y no es común
    • Tuve un error tipográfico: delivery_times__in. Véase la respuesta corregido.
    • Gracias por su respuesta. Me di cuenta de que el error antes de mi primer comentario. Si usted mira en mi primer comentario, se puede ver que se fija. ¿Hay cualquier cosa que usted puede pensar que podría causar este problema?
    • no excluir a tomar lista? exclude(delivery_time__in=t) donde t es una lista
    • Tengo trabajo, he seguido tu idea, pero cambió de código a la siguiente: blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date).values('delivery_time') delivery_times = DeliveryTime.objects.exclude(id__in=blocked_delivery_times). Si usted puede actualizar su respuesta con el código de arriba puedo aceptarlo. Muchas gracias

  2. 7

    Para la más reciente versión de Django (yo uso 1.10) usted no debe usar .objetos para la segunda línea.

    blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date) \
        .values('delivery‌​_time')
    delivery_times = DeliveryTime.exclude(id__in=blocked_delivery_times)
    • por qué? Es este un mejor rendimiento?
  3. 4

    Con la versión de Django 1.11 puede utilizar diferencia, que toma ventaja de la EXCEPT operador SQL. Yo creo que puede ser más eficiente, ya que no son la evaluación de una consulta para obtener una lista de valores.

Dejar respuesta

Please enter your comment!
Please enter your name here