Запросить по одному полю, получить список совпадений «после» на основе заказа по другому полю - PullRequest
2 голосов
/ 26 января 2012

Скажем, у меня есть следующая таблица, используемая для получения списка дельта-обновлений от клиента.Когда запись статьи создается, изменяется или удаляется, в таблицу ниже добавляется строка.

id | article_id | uuid
---|------------|-------------------------------------
 1 |         56 | 78b69fa0-480b-11e1-b86c-0800200c9a66
 2 |         23 | 87c4fe60-480b-11e1-b86c-0800200c9a66
 3 |         78 | 903973f0-480b-11e1-b86c-0800200c9a66
 4 |         23 | bb3972d0-480b-11e1-b86c-0800200c9a66
 5 |         28 | f05fdd00-480b-11e1-b86c-0800200c9a66

Клиент запоминает uuid из последней синхронизации и включает это в следующий запрос.Скажем, клиент уже знает об изменениях 1 и 2 выше;Затем он включит в запрос uuid 87c4fe60-480b-11e1-b86c-0800200c9a66 (id = 2).Теперь мне нужно вернуть строки 3-5.Если uuid от клиента отсутствует в таблице, и должна появиться ошибка.

Простой способ перебора - это сначала выполнить поиск на основе uuid, а затем использовать идентификатор найденной записи об изменении (id = 2 в данном случае) к поиску, где id> "found_id" (id> 2 в этом случае).

Есть ли более эффективный способ сделать запрос, то есть как-то выразить 'дай мне все строкипосле этого uuid, где строки сортируются по идентификатору по возрастанию '?

Ответы [ 2 ]

2 голосов
/ 26 января 2012

Вы можете заставить Django сделать это одним ударом по дб, хотя это все еще запрос + подзапрос, например:

MyModel.objects.filter(id__gt=MyModel.objects.filter(
     uuid='whatever').values_list('id',))
0 голосов
/ 26 января 2012

Вы можете использовать метод extra () Django и использовать необработанный SQL в выражении , где . Это позволит вам выбрать все статьи в одном запросе. Недостатком является то, что это сильно зависит от движка базы данных. Предполагая, что ваша модель называется Article:

articles = Article.objects.extra(where=["id > (
    SELECT t2.id FROM "+Article._meta.db_table+" t2
    WHERE t2.uuid= '87c4fe60-480b-11e1-b86c-0800200c9a66'
    LIMIT 1)"]
).order_by('id').all())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...