Django从一个查询集中排除另一个查询集

时间:2014-03-08 08:00:42

标签: django django-queryset

我有以下两种模式:

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()

delivery_times查询集我想删除所有blocked_delivery_times.delivery_time

我该怎么做?有什么建议?

3 个答案:

答案 0 :(得分:38)

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

答案 1 :(得分:6)

对于较新版本的Django(我使用1.10),你不应该在第二行使用.objects。

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

答案 2 :(得分:1)

随着Django 1.11的发布,您可以使用difference,它利用了EXCEPT SQL运算符。我认为它可能更有效,因为您没有评估查询以获取值列表。