如何检查从 Min 到 Max 的范围是否与 python 中的现有范围列表重叠

How to check if a range from Min to Max overlaps with the list of existing ranges in python

假设我有一个名为 Voucher 的模型,其中包含以下现有条目:

      ==MinPrice==      ==MaxPrice==
        10                 100
        101                200
        201                500

在Voucher 中插入新记录时table 我想检查新数据记录的MinPrice 和MaxPrice 范围不应与现有记录重叠。在这种情况下,以下所有条目都应被视为无效,因为它们与现有记录的范围重叠。

       50           800   Invalid
       50           80    Invalid
       150          199   Invalid
       200          300   Invalid

并且以下条目应该有效:

       501           550  Valid
       0             9    Valid

我尝试了以下 ORM 查询来检查是否有任何记录与新条目重叠。

query = Q(MinPrice__gte=minimum_price) & Q(MaxPrice__lte=maximum_price)
vouchers = Voucher.objects.filter(query)
if not vouchers:
    #save the new record

在这种情况下,首先查看优惠券何时重叠,然后反转条件会更容易。

那么,什么时候没有重叠?或者:

  • 新凭证完全小于现有凭证(例如Voucher(50, 100) vs Voucher(101, 200));或
  • 新凭证完全大于现有凭证(例如 Voucher(250, 300)Voucher(101, 200))。

下一个见解是这些条件都可以简化为:

  • old_voucher.MinPrice > maximum_price;或
  • old_voucher.MaxPrice < minimum_price.

然后我们反转整个条件,在 Django 查询 API 中用 ~:

完成
query = ~(Q(MinPrice__gt=maximum_price) | Q(MaxPrice__lt=minimum_price))

我们可以通过调用相关的De Morgan's law:

来消除~
query = ~Q(MinPrice__gt=maximum_price) & ~Q(MaxPrice__lt=minimum_price)

...然后使用否定比较规则将其简化为:

query = Q(MinPrice__lte=maximum_price) & Q(MaxPrice__gte=minimum_price)

这应该可以,但我无法为您测试。如果这对您不起作用,请考虑编辑您的问题,使其包含 minimal reproducible example.