我如何 select Django 中同一字段的两个范围?

How can I select two ranges of the same field in Django?

使用以下模型:

class Event(models.Model):
    latitude = models.FloatField()
    longitude = models.FloatField()

我想执行以下逻辑:

Select 纬度在范围 (float1, float2) 或范围 (float3, float4) 内的所有事件

在 SQL 中看起来像这样:

SELECT * FROM event WHERE latitude (BETWEEN float1 and float2) or latitude (BETWEEN float3 and float4);

我在 Django 中试过了,但我得到了 "SyntaxError: keyword argument repeated":

Events.objects.filter(latitude__range=(float1, float2), latitude__range=(float3, float4)

如果你想保持你提到的更好的可读性,试试这个:

 SELECT * 
 FROM event 
 WHERE (latitude BETWEEN float1 AND float2) 
 OR (latitude BETWEEN float3 AND float4);```

错误是因为 fieldName BETWEEN value1 AND value2 是唯一的语法。实际上你不需要添加括号:

SELECT * FROM event 
WHERE latitude BETWEEN float1 and float2 OR 
latitude BETWEEN float3 and float4;

如果为了便于阅读而想添加括号,您可以添加如下:

SELECT * FROM event 
WHERE (latitude BETWEEN float1 and float2) OR 
(latitude BETWEEN float3 and float4);

使用 Q()|Q()

from django.db.models import Q
Event.objects.filter(
    Q(latitude__range=(float1,float2)) | Q(latitude__range=(float3,float4))
)

查看文档https://docs.djangoproject.com/zh-hans/2.2/topics/db/queries/#complex-lookups-with-q-objects