Django исключая один запрос из другого

У меня есть две следующие модели:

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

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

Я хочу вернуть все доступные сроки доставки в течение дня, то есть все DeliveryTime, за исключением BlockedDeliveryTime.

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

From delivery_times queryset Я хочу удалить все заблокированные_delivery_times.delivery_time

Как я могу это сделать? Какие-либо предложения?

Ответы

Ответ 1

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

Ответ 2

Для более новой версии Django (я использую 1.10) вы не должны использовать .object для второй строки.

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

Ответ 3

С выпуском Django 1.11 вы можете использовать difference, который использует оператор EXCEPT SQL. Я думаю, что это может быть более эффективно, потому что вы не оцениваете запрос, чтобы получить список значений.