2

我需要在 Django 模型上运行以下查询:

SELECT *
FROM app_model
WHERE GREATEST(field1, fixed_value) < LEAST(field2, another_fixed_value)

有什么方法可以让我在不使用 raw() 方法的情况下运行这个查询?

4

2 回答 2

1

您至少可以避免raw使用extra. 我认为 ORM 不会以其他方式暴露GREATESTLEAST.

从理论上讲,您可以将约束分解为不同的可能性并将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)'])
于 2013-07-09T23:22:24.420 回答
0

看看字段查找

   Model.objects.filter(id__gt=4)

相当于:

SELECT ... WHERE id > 4;

少于

Model.objects.filter(id__lt=4)

相当于:

SELECT ... WHERE id < 4;
于 2013-07-09T23:10:49.307 回答