Удалите дубликаты из нескольких полей и верните набор запросов в Django - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть запрос, который я отправляю через контекст следующим образом:

context = { 
    'locations' = TravelData.objects.exclude(Q(from_lat__isnull=True) | Q(from_long__isnull=True) | Q(to_lat__isnull=True) | Q(to_long__isnull=True)).values('from_lat', 'from_long', 'to_lat', 'to_long')
}

Здесь есть несколько значений (from_lat и from_long) и (to_lat и to_long). Я хотел бы добавить аналогичные значения только один раз, т. Е. Я должен проверять одновременно и значения from, и значения to и исключать их наличие.

Во внешнем интерфейсе я отображаю эти местоположения на карте координаты точки будут

[from_long, from_lat] or [to_long, to_lat]

Как изменить вышеуказанный запрос, чтобы получить наиболее эффективный набор запросов?

Редактировать:

Это пример набора запросов:

<QuerySet [{'to_lat': '52.92732', 'to_long': '77.63575', 'from_lat': '52.92415', 'from_long': '77.67229'}, {'to_lat': '52.92768', 'to_long': '77.62664', 'from_lat': '52.96691', 'from_long': '77.74935'}, {'to_lat': '53.047926', 'to_long': '77.597766', 'from_lat': '52.937222', 'from_long': '77.626915'}, {'to_lat': '52.97143', 'to_long': '77.63914', 'from_lat': '52.98999', 'from_long': '77.55332'}, {'to_lat': '52.92732', 'to_long': '77.63575', 'from_lat': '52.92415', 'from_long': '77.67229'}, {'to_lat': '52.92768', 'to_long': '77.62664', 'from_lat': '52.96691', 'from_long': '77.74935'}, {'to_lat': '53.047926', 'to_long': '77.597766', 'from_lat': '52.937222', 'from_long': '77.626915'}, {'to_lat': '52.97143', 'to_long': '77.63914', 'from_lat': '52.98999', 'from_long': '77.55332'}, {'to_lat': '52.97143', 'to_long': '77.63914', 'from_lat': '58.98999', 'from_long': '80.55332'}]>

В теге <script> файла html часть кода выглядит следующим образом:

var locations_object = {
    type: 'FeatureCollection',
    features: [
        {% for i in locations %}
            {
                type: 'Feature',
                geometry: {
                    type: 'geojson',
                    coordinates: ["{{i.from_long}}", "{{i.from_lat}}"]
                },
                properties: {
                    title: 'from_locations',
                    description: 'from_locations'
                }
            },
            {
                type: 'Feature',
                geometry: {
                    type: 'geojson',
                    coordinates: ["{{i.to_long}}", "{{i.to_lat}}"]
                },
                properties: {
                    title: 'to_locations',
                    description: 'to_locations'
                }
            },
        {% endfor %}
    ]
};

Так что здесь есть местоположение с одни и те же значения координат повторяются много раз в базе данных, как показано в переменной locations контекста. Но при рендеринге карты это нужно только один раз. Таким образом, в запросе в контексте, как я могу взять пары [to_lat, to_long] и [from_lat, from_long] только один раз, если это возможно? Например: в locations из context первые четыре элемента повторяются снова. Поэтому я должен рассмотреть это только один раз. Затем в девятом элементе to_lat и to_long повторяются, поскольку они уже присутствовали в предыдущем элементе. Поэтому я должен исключить это, но from_lat и from_long отсутствуют в предыдущих элементах. Я должен рассмотреть только это в девятом элементе. Аналогично для всех условий.

1 Ответ

0 голосов
/ 29 апреля 2020

Похоже, вам просто нужно искать отдельные объекты TravelData на основе этих 4 полей. Вы можете просто добавить .distinct(*fields) к запросу, чтобы получить то, что вы ищете.

Поскольку вам нужны разные значения для пар, я бы предложил сделать отличные для одной из пар в запросе, тогда вы могли бы создавать наборы из значений

latlong = TravelData.objects.exclude(
        Q(from_lat__isnull=True) | 
        Q(from_long__isnull=True) | 
        Q(to_lat__isnull=True) | 
        Q(to_long__isnull=True)
    ).distinct('from_lat', 'from_long'
).values('from_lat', 'from_long', 'to_lat', 'to_long')

from_pairs = {(x['from_lat'], x['from_long']) for x in latlong}
to_pairs = {(x['to_lat'], x['to_long']) for x in latlong}

all_possible_from_to_pairs = {(from, to) for from in from_pairs for to in to_pairs}

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#django .db.models.query.QuerySet.distinct

Редактировать: Обновлен код после более четкого понимания вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...