【问题标题】:Django excluding one queryset from anotherDjango 从另一个中排除一个查询集
【发布时间】:2014-04-11 13:59:11
【问题描述】:

我有以下两种型号:

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

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

【问题讨论】:

标签: django django-queryset


【解决方案1】:
blocked_delivery_times = BlockedDeliveryTime.objects.filter(delivery_date=delivery_date) \
    .values('delivery‌​_time')
delivery_times = DeliveryTime.objects.exclude(id__in=blocked_delivery_times)

【讨论】:

  • 这正是我一直在寻找的,但排除不起作用 delivery_times = DeliveryTime.objects.exclude(delivery_time__in=t) 正在返回所有 DeliveryTime
  • @reevh,我打错了:delivery_times__in。查看更正的答案。
  • 感谢您的回复。在我第一次发表评论之前,我注意到了那个错字。如果您查看我的第一条评论,您会发现它已修复。你能想到什么会导致这个问题吗?
  • 是否排除拍摄清单? exclude(delivery_time__in=t) 其中t 是一个列表
  • 得到它的工作,我按照你的想法,但将代码更改为以下内容: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.11 的发布,您可以使用difference,它利用了EXCEPT SQL 运算符。我认为它可能更有效,因为您没有评估查询以获取值列表。

【讨论】:

    【解决方案3】:

    对于较新版本的 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)
    

    【讨论】:

    • 为什么不应该在第二行使用 .objects?
    • 这只是他们对较新版本的 django 所做的更改
    猜你喜欢
    • 1970-01-01
    • 2016-05-09
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 2018-03-27
    • 2016-05-15
    相关资源
    最近更新 更多