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)