Django excluding one queryset from another

I have the following two models:

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

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

I want to return all the available delivery times for a day i.e. all DeliveryTime excluding the BlockedDeliveryTime.

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

From delivery_times queryset I want to remove all blocked_delivery_times.delivery_time

How can I do that? Any suggestions?


blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date) \
    .values('delivery‌​_time')
delivery_times = DeliveryTime.objects.exclude(id__in=blocked_delivery_times)

With the release of Django 1.11 you can use difference, which takes advantage of the EXCEPT SQL operator. I think it might be more efficient because you aren't evaluating a query to get a list of values.


For newer version of Django (I use 1.10) you should not use .objects for the second line.

blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date) \
    .values('delivery‌​_time')
delivery_times = DeliveryTime.exclude(id__in=blocked_delivery_times)