Как я могу выбрать два диапазона одного и того же поля в Django?

Со следующей моделью:

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

Я хотел бы выполнить следующую логику:

Выбрать все события, широта которых находится в диапазоне (float1, float2) или в диапазоне (float3, float4)

Это выглядит так в SQL:

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

Я пробовал это в Django, но получаю «SyntaxError: повторение аргумента ключевого слова»:

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

person Rage    schedule 06.06.2020    source источник
comment
не заключайте скобки вокруг BEWEEN. latitude BETWEEN float1 and float2 — это уникальная часть синтаксиса, которая не будет объединена с or.   -  person danblack    schedule 06.06.2020
comment
Я просто делаю это для разборчивости   -  person Rage    schedule 06.06.2020


Ответы (3)


используя 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

person Blackdoor    schedule 06.06.2020

Попробуйте это, если вы хотите сохранить лучшую читаемость, как вы упомянули:

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

Ошибка в том, что fieldName МЕЖДУ значение1 AND значение2 имеет уникальный синтаксис. И на самом деле вам не нужно добавлять скобки:

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);
person Grace    schedule 06.06.2020
comment
@Rage, посмотрим, поможет ли это - person Grace; 06.06.2020
comment
Спасибо, но вопрос требует запроса Django ORM. - person Rage; 06.06.2020