我需要在 Django 模型上运行以下查询:
SELECT *
FROM app_model
WHERE GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value)
有什么方法可以让我在不使用 raw() 方法的情况下运行这个查询?
我需要在 Django 模型上运行以下查询:
SELECT *
FROM app_model
WHERE GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value)
有什么方法可以让我在不使用 raw() 方法的情况下运行这个查询?
您至少可以避免raw
使用extra
. 我认为 ORM 不会以其他方式暴露GREATEST
或LEAST
.
从理论上讲,您可以将约束分解为不同的可能性并将or
它们组合在一起:
mymodel.objects.filter(Q(field1__gt=fixed_value and field2__lt=another_fixed_value and field1__lt=field2) | \
Q(field1__lte=fixed_value and field2__lt=another_fixed_value and field2__gt=fixed_value) | \
Q(field1__gt=fixed_value and field2__gte=another_fixed_value and field1__lt=another_fixed_value) | \
Q(field1__lte=fixed_value and field2__gte=another_fixed_value and fixed_value < another_fixed_value))
除非很明显你实际上不会包括那个and fixed_value < another_fixed_value
。如果它们实际上是固定的并且您在编写代码时知道它们,那么您只需进行前两次比较 - 如果您不知道它们,则仅在必要时构建最后一个 Q 对象和/或它到查询中。
也就是说,这太可怕了,我认为这extra
是一个更好的选择。
mymodel.objects.extra(where=['GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value)'])
看看字段查找
Model.objects.filter(id__gt=4)
相当于:
SELECT ... WHERE id > 4;
少于
Model.objects.filter(id__lt=4)
相当于:
SELECT ... WHERE id < 4;