如何检查从 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.
假设我有一个名为 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)
vsVoucher(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.